home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / cg.lha / cg / src / Semantics.mi < prev    next >
Text File  |  1992-11-24  |  65KB  |  2,632 lines

  1. IMPLEMENTATION MODULE Semantics;
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15. IMPORT SYSTEM, System, IO, Tree;
  16. (* line 9 "" *)
  17.  
  18.  
  19. FROM SYSTEM    IMPORT TSIZE, ADR;
  20. FROM General    IMPORT Max;
  21. FROM IO        IMPORT StdOutput, WriteN, WriteS, WriteI, WriteNl;
  22. FROM DynArray    IMPORT MakeArray;
  23. FROM StringMem    IMPORT tStringRef;
  24. FROM Strings    IMPORT tString, IntToString, Append, Concatenate, ArrayToString,
  25.             Length, Char;
  26. FROM Idents    IMPORT WriteIdent, tIdent, NoIdent, MakeIdent, MaxIdent, GetString;
  27. FROM Texts    IMPORT MakeText;
  28.  
  29. FROM Sets    IMPORT
  30.    tSet        , MakeSet    , ReleaseSet    , AssignEmpty    ,
  31.    IsElement    , Include    , IsEmpty    , Extract    ,
  32.    Select    , Difference    , Complement    , ForallDo    ;
  33.  
  34. FROM Relations    IMPORT tRelation, MakeRelation, IsCyclic, GetCyclics, Assign, IsRelated;
  35. FROM Positions    IMPORT NoPosition;
  36.  
  37. FROM Tree    IMPORT
  38.    NoTree    , tTree        , tInstance    , tInstancePtr    ,
  39.    Computed    , Reverse    , Write        , Read        ,
  40.    Inherited    , Synthesized    , Input        , Output    ,
  41.    Stack    , Variable    , Ignore    , CopyDef    ,
  42.    CopyUse    , Thread    , NoAttribute    , MultInhComp    ,
  43.    Test        , Left        , Right        , NoCodeAttr    ,
  44.    NonBaseComp    , Dummy        , Terminal    ,
  45.    Nonterminal    , HasChildren    , HasAttributes    , HasActions    ,
  46.    Reachable    , Referenced    , Implicit    , mActionPart    ,
  47.    mClass    , mAttribute    , mChild    , mIdent    ,
  48.    mCopy    , mDesignator    , MaxSet    , WriteName    ,
  49.    Options    , TreeRoot    , ForallClasses    , ForallAttributes,
  50.    GrammarClass    , cLNC        , WriteDependencies, WriteClass    ,
  51.    IdentifyClass, IdentifyAttribute, IdentifyModule, TypeNames    ,
  52.    ClassCount    , nNoClass    , nNoAttribute    , nNoDesignator    ,
  53.    nNoAction    , nNoName    , iPosition    , itPosition    ,
  54.    WriteCyclics    , HasItem    , Mark        , Abstract    ,
  55.    InitIdentifyClass, InitIdentifyClass2;
  56.    
  57. IMPORT Relations, StringMem, Errors;
  58.  
  59. CONST
  60. AssignmentWithIncorrectLeftHandSide    = 10    ;
  61. CopyRuleWithIncorrectLeftHandSide    = 11    ;
  62. BlockWithIncorrectLeftHandSide    = 12    ;
  63. CheckWithoutStatement    = 13    ;
  64. InheritedUseOfSynthesizedAttribute    = 14    ;
  65. AttributeMultipleComputed    = 15    ;
  66. AttributeNotDeclared    = 16    ;
  67. SelectorNotDeclared    = 17    ;
  68. SynthesizedUseOfInheritedAttribute    = 18    ;
  69. CopyRuleInsertionsInherited    = 19    ;
  70. CopyRuleInsertionsSynthesized    = 20    ;
  71. CopyRuleInsertionsThreaded    = 21    ;
  72. ModuleNotDeclared    = 22    ;
  73. TerminalCodeMultipleUsed    = 23    ;
  74. NodeTypeNotDeclared    = 24    ;
  75. OnlyOneReverseInNodeType    = 25    ;
  76. NodeTypeMultipleDeclared    = 26    ;
  77. VariantSelectorMultipleDeclared    = 27    ;
  78. PrecedenceNotDeclared    = 28    ;
  79. SelectorMultipleDeclared    = 29    ;
  80. PrecedenceMultipleDeclared    = 30    ;
  81. AbstractTypeRequired    = 31    ;
  82. ChildRequired    = 32    ;
  83. AttributeNeverSet    = 33    ;
  84. AttributeNeverUsed    = 34    ;
  85. InputAttributeIsSet    = 35    ;
  86. AttributeSynthesizedAsWellAsInherited    = 36    ;
  87. NodeTypeNotUsed    = 37    ;
  88. InheritedAttributesOnlyInBaseClasses    = 38    ;
  89. AttributeComputationMissing    = 39    ;
  90. CycleInLocalDependenciesDP    = 40    ;
  91.  
  92. VAR
  93.    CopyInherited, CopySynthesized, CopyThreaded,
  94.    ChildCount, AttributeCount, ActionCount: INTEGER;
  95.    ItemCount    ,
  96.    ChecksCount    ,
  97.    ReverseCount    : INTEGER;
  98.    iNull    ,
  99.    Ident    : tIdent;
  100.    ClassNames    ,
  101.    SelectorNames,
  102.    VariantNames    ,
  103.    PrecNames    ,
  104.    CodesUsed    ,
  105.    Results    ,
  106.    Arguments    ,
  107.    Cyclics    : tSet;
  108.    MaxInstCount    ,
  109.    TokenCode    ,
  110.    DummyIndex    ,
  111.    i, j, k    : SHORTCARD;
  112.    InstanceSize    : LONGINT;
  113.    IsAbstract    ,
  114.    Success    : BOOLEAN;
  115.    Module    ,
  116.    Node        ,
  117.    Attribute    ,
  118.    Child    ,
  119.    TheAction    ,
  120.    TheClass    ,
  121.    Class    : tTree;
  122.    String    ,
  123.    String2    : tString;
  124.    ActProperties: BITSET;
  125.  
  126. PROCEDURE LookUp (i: tIdent; t: tTree): BOOLEAN;
  127.    BEGIN
  128.       WHILE t^.Kind = Tree.Name DO
  129.      IF t^.Name.Name = i THEN RETURN TRUE; END;
  130.      t := t^.Name.Next;
  131.       END;
  132.       RETURN FALSE;
  133.    END LookUp;
  134.  
  135. PROCEDURE ProcessIgnore2 (t: tTree): tTree;
  136.    VAR r: tTree;
  137.    BEGIN
  138.       IF t^.Kind # Tree.NoAttribute THEN
  139.      t^.AttrOrAction.Next := ProcessIgnore2 (t^.AttrOrAction.Next);
  140.       END;
  141.       IF (t^.Kind = Tree.Child) AND (Ignore IN t^.Child.Properties) OR
  142.          (t^.Kind = Tree.Attribute) AND (Ignore IN t^.Attribute.Properties) OR
  143.          (t^.Kind = Tree.ActionPart) AND (Ignore IN t^.ActionPart.Properties) THEN
  144.      RETURN t^.AttrOrAction.Next;
  145.       END;
  146.       RETURN t;
  147.    END ProcessIgnore2;
  148.  
  149. PROCEDURE CompBaseClass (t, b: tTree);
  150.    BEGIN
  151.       IF t^.Kind = Tree.Class THEN
  152.      t^.Class.BaseClass := b;
  153.      CompBaseClass (t^.Class.Next, b);
  154.      CompBaseClass (t^.Class.Extensions, t);
  155.       END;
  156.    END CompBaseClass;
  157.  
  158. PROCEDURE CompParsIndex (t: tTree; VAR Index: SHORTCARD);
  159.    VAR OldIndex    : SHORTCARD;
  160.    BEGIN
  161.       OldIndex := Index;
  162.       CASE t^.Kind OF
  163.       | Tree.Class:
  164.      CompParsIndex (t^.Class.Attributes, Index);
  165.      CompParsIndex (t^.Class.Extensions, Index);
  166.      CompParsIndex (t^.Class.Next, OldIndex);
  167.       | Tree.Child:
  168.      INC (Index);
  169.      t^.Child.ParsIndex := Index;
  170.      CompParsIndex (t^.Child.Next, Index);
  171.       | Tree.Attribute:
  172.      CompParsIndex (t^.Attribute.Next, Index);
  173.       | Tree.ActionPart:
  174.      INC (Index);
  175.      t^.ActionPart.ParsIndex := Index;
  176.      INC (ActionCount);
  177.      t^.ActionPart.Name := ActionCount;
  178.      CompParsIndex (t^.ActionPart.Next, Index);
  179.       ELSE
  180.       END;
  181.    END CompParsIndex;
  182.  
  183. PROCEDURE CompIndex (t: tTree; In: SHORTCARD; VAR Out: SHORTCARD);
  184.    BEGIN
  185.       CASE t^.Kind OF
  186.       | Tree.Class:
  187.      CompIndex (t^.Class.Attributes, In, Out);
  188.      t^.Class.AttrCount := Out;
  189.      CompIndex (t^.Class.Extensions, Out, Out);
  190.      CompIndex (t^.Class.Next, In, Out);
  191.       | Tree.NoClass:
  192.       | Tree.Child:
  193.      INC (In);
  194.      t^.Child.AttrIndex := In;
  195.      CompIndex (t^.Child.Next, In, Out);
  196.       | Tree.Attribute:
  197.      INC (In);
  198.      t^.Attribute.AttrIndex := In;
  199.      CompIndex (t^.Attribute.Next, In, Out);
  200.       | Tree.ActionPart:
  201.      CompIndex (t^.ActionPart.Next, In, Out);
  202.       | Tree.NoAttribute:
  203.      Out := In;
  204.       END;
  205.    END CompIndex;
  206.  
  207. PROCEDURE CompInstance (t: tTree; In: SHORTCARD; VAR Out: SHORTCARD);
  208.    BEGIN
  209.       CASE t^.Kind OF
  210.       | Tree.Class:
  211.      CompInstance (t^.Class.Attributes, In , Out);
  212.      t^.Class.InstCount := t^.Class.AttrCount + Out;
  213.      MaxInstCount := Max (MaxInstCount, t^.Class.InstCount);
  214.      CompInstance (t^.Class.Extensions, Out, Out);
  215.      CompInstance (t^.Class.Next, In, Out);
  216.       | Tree.NoClass:
  217.       | Tree.Child:
  218.      t^.Child.InstOffset := In;
  219.      IF t^.Child.Class # NoTree THEN
  220.         CompInstance (t^.Child.Next, In + t^.Child.Class^.Class.AttrCount, Out);
  221.      ELSE
  222.         CompInstance (t^.Child.Next, In, Out);
  223.      END;
  224.       | Tree.Attribute:
  225.      CompInstance (t^.Attribute.Next, In, Out);
  226.       | Tree.ActionPart:
  227.      CompInstance (t^.ActionPart.Next, In, Out);
  228.       | Tree.NoAttribute:
  229.      Out := In;
  230.       END;
  231.    END CompInstance;
  232.  
  233. PROCEDURE CompBitCount (t: tTree; In: SHORTCARD; VAR Out: SHORTCARD);
  234.    BEGIN
  235.       CASE t^.Kind OF
  236.       | Tree.Class:
  237.      CompBitCount (t^.Class.Attributes, In, Out);
  238.      t^.Class.BitCount := Out;
  239.      CompBitCount (t^.Class.Extensions, Out, Out);
  240.      CompBitCount (t^.Class.Next, In, Out);
  241.       | Tree.NoClass:
  242.       | Tree.Child:
  243.      IF {Input, Test, Dummy} * t^.Child.Properties = {} THEN INC (In); END;
  244.      CompBitCount (t^.Child.Next, In, Out);
  245.       | Tree.Attribute:
  246.      IF {Input, Test, Dummy} * t^.Attribute.Properties = {} THEN INC (In); END;
  247.      CompBitCount (t^.Attribute.Next, In, Out);
  248.       | Tree.ActionPart:
  249.      CompBitCount (t^.ActionPart.Next, In, Out);
  250.       | Tree.NoAttribute:
  251.      Out := In;
  252.       END;
  253.    END CompBitCount;
  254.  
  255. PROCEDURE CompBitOffset (t: tTree; In: SHORTCARD; VAR Out: SHORTCARD);
  256.    BEGIN
  257.       CASE t^.Kind OF
  258.       | Tree.Class:
  259.      CompBitOffset (t^.Class.Attributes, In , Out);
  260.      CompBitOffset (t^.Class.Extensions, Out, Out);
  261.      CompBitOffset (t^.Class.Next, In, Out);
  262.       | Tree.NoClass:
  263.       | Tree.Child:
  264.      t^.Child.BitOffset := In;
  265.      IF t^.Child.Class # NoTree THEN
  266.         CompBitOffset (t^.Child.Next, In + t^.Child.Class^.Class.BitCount, Out);
  267.      ELSE
  268.         CompBitOffset (t^.Child.Next, In, Out);
  269.      END;
  270.       | Tree.Attribute:
  271.      CompBitOffset (t^.Attribute.Next, In, Out);
  272.       | Tree.ActionPart:
  273.      CompBitOffset (t^.ActionPart.Next, In, Out);
  274.       | Tree.NoAttribute:
  275.      Out := In;
  276.       END;
  277.    END CompBitOffset;
  278.  
  279. PROCEDURE InitInstance (t: tTree; Offset: SHORTCARD; InstancePtr: tInstancePtr);
  280.    BEGIN
  281.       CASE t^.Kind OF
  282.       | Tree.Class:
  283.      InitInstance (t^.Class.BaseClass , Offset, InstancePtr);
  284.      InitInstance (t^.Class.Attributes, Offset, InstancePtr);
  285.       | Tree.NoClass:
  286.       | Tree.Child:
  287.      WITH InstancePtr^ [t^.Child.AttrIndex] DO
  288.         Attribute  := t;
  289.         Properties := t^.Child.Properties + {Left};
  290.         Action     := ADR (Action);
  291.      END;
  292.      IF t^.Child.Class # NoTree THEN
  293.         InitInstance1 (t^.Child.Class, t, Offset + t^.Child.InstOffset, InstancePtr);
  294.      END;
  295.      InitInstance (t^.Child.Next, Offset, InstancePtr);
  296.       | Tree.Attribute:
  297.      WITH InstancePtr^ [t^.Attribute.AttrIndex] DO
  298.         Attribute  := t;
  299.         Properties := t^.Attribute.Properties + {Left};
  300.         Action     := ADR (Action);
  301.      END;
  302.      InitInstance (t^.Attribute.Next, Offset, InstancePtr);
  303.       | Tree.ActionPart:
  304.      InitInstance (t^.ActionPart.Next, Offset, InstancePtr);
  305.       | Tree.NoAttribute:
  306.       END;
  307.    END InitInstance;
  308.  
  309. PROCEDURE InitInstance1 (t, selector: tTree; Offset: SHORTCARD; InstancePtr: tInstancePtr);
  310.    BEGIN
  311.       CASE t^.Kind OF
  312.       | Tree.Class:
  313.      InitInstance1 (t^.Class.BaseClass , selector, Offset, InstancePtr);
  314.      InitInstance1 (t^.Class.Attributes, selector, Offset, InstancePtr);
  315.       | Tree.NoClass:
  316.       | Tree.Child:
  317.      WITH InstancePtr^ [Offset + t^.Child.AttrIndex] DO
  318.         Selector   := selector;
  319.         Attribute  := t;
  320.         Properties := t^.Child.Properties + {Right};
  321.         Action     := ADR (Action);
  322.      END;
  323.      InitInstance1 (t^.Child.Next, selector, Offset, InstancePtr);
  324.       | Tree.Attribute:
  325.      WITH InstancePtr^ [Offset + t^.Attribute.AttrIndex] DO
  326.         Selector   := selector;
  327.         Attribute  := t;
  328.         Properties := t^.Attribute.Properties + {Right};
  329.         Action     := ADR (Action);
  330.      END;
  331.      InitInstance1 (t^.Attribute.Next, selector, Offset, InstancePtr);
  332.       | Tree.ActionPart:
  333.      InitInstance1 (t^.ActionPart.Next, selector, Offset, InstancePtr);
  334.       | Tree.NoAttribute:
  335.       END;
  336.    END InitInstance1;
  337.  
  338. VAR relation    : tRelation;
  339. VAR result    : INTEGER;
  340.  
  341. PROCEDURE EnterDependency (argument: CARDINAL);
  342.    BEGIN
  343.       Relations.Include (relation, result, argument);
  344.    END EnterDependency;
  345.  
  346. VAR MultipleInheritedActions    : BOOLEAN;
  347.  
  348. PROCEDURE CompDP1 (t: tTree; VAR Set: tSet; Usage: INTEGER; NonBase, Check: BOOLEAN);
  349.    VAR Attribute, ChildsClass    : tTree;
  350.    VAR Offset    : SHORTCARD;
  351.    BEGIN
  352.       CASE t^.Kind OF
  353.       | Tree.Class:
  354.         CompDP1 (t^.Class.BaseClass , Set, Usage, FALSE  , Check);
  355.         MultipleInheritedActions := FALSE;
  356.         CompDP1 (t^.Class.Attributes, Set, Usage, NonBase, Check);
  357.       | Tree.NoClass:
  358.       | Tree.Attribute:
  359.         IF t^.Attribute.AttrIndex # DummyIndex THEN        (* HAGs *)
  360.            Relations.Include (relation, DummyIndex, t^.Attribute.AttrIndex);
  361.         END;
  362.         CompDP1 (t^.Attribute.Next, Set, Usage, NonBase, Check);
  363.       | Tree.Child:
  364.         ChildsClass := t^.Child.Class;
  365.         IF ChildsClass # NoTree THEN
  366.            IF NOT (Input IN t^.Child.Properties) THEN    (* HAGs *)
  367.           Relations.Include (relation, DummyIndex, t^.Child.AttrIndex);
  368.           FOR i := 1 TO ChildsClass^.Class.AttrCount DO
  369.              Relations.Include (relation, Class^.Class.AttrCount + t^.Child.InstOffset + i, t^.Child.AttrIndex);
  370.           END;
  371.            END;
  372.  
  373.            Attribute := IdentifyAttribute (ChildsClass, iNull);
  374.            Offset := Class^.Class.AttrCount + t^.Child.InstOffset + Attribute^.Child.AttrIndex;
  375.            Relations.Include (relation, DummyIndex, Offset);
  376.            INCL (Class^.Class.Instance^[Offset].Properties, Right);
  377.         END;
  378.         CompDP1 (t^.Child.Next, Set, Usage, NonBase, Check);
  379.       | Tree.ActionPart:
  380.         IF MultInhComp IN t^.ActionPart.Properties THEN MultipleInheritedActions := TRUE; END;
  381.         CompDP1 (t^.ActionPart.Actions, Set, Usage, NonBase, Check);
  382.         CompDP1 (t^.ActionPart.Next   , Set, Usage, NonBase, Check);
  383.       | Tree.NoAttribute:
  384.       | Tree. Assign :
  385.         IF IsCopy (t^.Assign.Arguments) THEN t^.Kind := Tree.Copy; END;
  386.         AssignEmpty (Results  );
  387.         AssignEmpty (Arguments);
  388.         CompDP1 (t^.Assign.Results  , Results  , Write, NonBase, TRUE );
  389.         CompDP1 (t^.Assign.Arguments, Arguments, Read , NonBase, FALSE);
  390.         IF IsEmpty (Results) THEN
  391. Tree.Error (AssignmentWithIncorrectLeftHandSide, t^.Assign.Pos);
  392.         END;
  393.         WHILE NOT IsEmpty (Results) DO
  394.            result := Extract (Results);
  395.            WITH Class^.Class.Instance^[result] DO
  396.           IF (Action = ADR (Action)) OR (MultInhComp IN Properties) OR NOT MultipleInheritedActions THEN
  397.              Action := t;
  398.              IF t^.Kind = Tree.Copy THEN CopyArg := Select (Arguments); END;
  399.           END;
  400.            END;
  401.            ForallDo (Arguments, EnterDependency);
  402.         END;
  403.         CompDP1 (t^.Assign.Next, Set, Usage, NonBase, Check);
  404.       | Tree. Copy :
  405.         AssignEmpty (Results  );
  406.         AssignEmpty (Arguments);
  407.         CompDP1 (t^.Copy.Results  , Results  , Write, NonBase, TRUE );
  408.         CompDP1 (t^.Copy.Arguments, Arguments, Read , NonBase, TRUE );
  409.         IF IsEmpty (Results) THEN
  410. Tree.Error (CopyRuleWithIncorrectLeftHandSide, t^.Copy.Pos);
  411.         END;
  412.         WHILE NOT IsEmpty (Results) DO
  413.            result := Extract (Results);
  414.            WITH Class^.Class.Instance^[result] DO
  415.           IF (Action = ADR (Action)) OR (MultInhComp IN Properties) OR NOT MultipleInheritedActions THEN
  416.              Action  := t;
  417.              CopyArg := Select (Arguments);
  418.           END;
  419.            END;
  420.            ForallDo (Arguments, EnterDependency);
  421.         END;
  422.         CompDP1 (t^.Copy.Next, Set, Usage, NonBase, Check);
  423.       | Tree. TargetCode :
  424.         AssignEmpty (Results  );
  425.         AssignEmpty (Arguments);
  426.         CompDP1 (t^.TargetCode.Results, Results  , Write, NonBase, TRUE );
  427.         CompDP1 (t^.TargetCode.Code   , Arguments, Read , NonBase, FALSE);
  428.         Difference (Arguments, Results);
  429.         IF IsEmpty (Results) AND IsCode (t^.TargetCode.Code) THEN
  430. Tree.Error (BlockWithIncorrectLeftHandSide, t^.TargetCode.Pos);
  431.         END;
  432.         WHILE NOT IsEmpty (Results) DO
  433.            result := Extract (Results);
  434.            WITH Class^.Class.Instance^[result] DO
  435.           IF (Action = ADR (Action)) OR (MultInhComp IN Properties) OR NOT MultipleInheritedActions THEN
  436.              Action  := t;
  437.           END;
  438.            END;
  439.            ForallDo (Arguments, EnterDependency);
  440.         END;
  441.         CompDP1 (t^.TargetCode.Next, Set, Usage, NonBase, Check);
  442.       | Tree. Order:
  443.         AssignEmpty (Results  );
  444.         AssignEmpty (Arguments);
  445.         CompDP1 (t^.Order.Results  , Results  , Read, NonBase, TRUE );
  446.         CompDP1 (t^.Order.Arguments, Arguments, Read, NonBase, TRUE );
  447.         WHILE NOT IsEmpty (Results) DO
  448.            result := Extract (Results);
  449.            ForallDo (Arguments, EnterDependency);
  450.         END;
  451.         CompDP1 (t^.Order.Next, Set, Usage, NonBase, Check);
  452.       | Tree. Check :
  453.         IF t^.Check.Results # NoTree THEN
  454.            AssignEmpty (Results  );
  455.            AssignEmpty (Arguments);
  456.            CompDP1 (t^.Check.Results, Results, Write, NonBase, FALSE);
  457.         END;
  458.         IF t^.Check.Condition # NoTree THEN
  459.            CompDP1 (t^.Check.Condition, Arguments, Read, NonBase, FALSE);
  460.         END;
  461.         IF t^.Check.Statement # NoTree THEN
  462.            CompDP1 (t^.Check.Statement, Arguments, Read, NonBase, FALSE);
  463.         ELSE
  464. Tree.Warning (CheckWithoutStatement, t^.Check.Pos);
  465.         END;
  466.         CompDP1 (t^.Check.Actions, Arguments, Read, NonBase, FALSE);
  467.         IF t^.Check.Results # NoTree THEN
  468.            result := Extract (Results);
  469.            Class^.Class.Instance^[result].Action := t;
  470.            ForallDo (Arguments, EnterDependency);
  471.            CompDP1 (t^.Check.Next, Set, Usage, NonBase, Check);
  472.         END;
  473.       | Tree.NoAction:
  474.       | Tree. Designator :
  475.         Attribute := IdentifyAttribute (Class, t^.Designator.Selector);
  476.         IF (Attribute # NoTree) AND (Attribute^.Kind = Tree.Child) THEN
  477.            ChildsClass := Attribute^.Child.Class;
  478.            Offset := Class^.Class.AttrCount + Attribute^.Child.InstOffset;
  479.            INCL (Attribute^.Child.Properties, Read);
  480.            IF ChildsClass # NoTree THEN
  481.           Attribute := IdentifyAttribute (ChildsClass, t^.Designator.Attribute);
  482.           IF Attribute # NoTree THEN
  483.              Include (Set, Offset + Attribute^.Child.AttrIndex);
  484.              INCL (Attribute^.Child.Properties, Usage);
  485.              IF Usage = Write THEN
  486.             INCL (Attribute^.Child.Properties, Inherited);
  487.             INCL (Class^.Class.Instance^ [Offset + Attribute^.Child.AttrIndex].Properties, Computed);
  488.             IF Synthesized IN Attribute^.Child.Properties THEN
  489. Tree.ErrorI (InheritedUseOfSynthesizedAttribute, t^.Designator.Pos, Errors.Ident, ADR (t^.Designator.Attribute));
  490.             END;
  491.             WITH Class^.Class.Instance^ [Offset + Attribute^.Child.AttrIndex] DO
  492.                IF NonBase AND NOT MultipleInheritedActions AND (NonBaseComp IN Properties) AND
  493.                   NOT (MultInhComp IN Properties) THEN
  494. Tree.ErrorI (AttributeMultipleComputed, t^.Designator.Pos, Errors.Ident, ADR (t^.Designator.Attribute));
  495.                END;
  496.                IF NOT MultipleInheritedActions OR (MultInhComp IN Properties) THEN
  497.                   EXCL (Properties, MultInhComp);
  498.                   IF NonBase THEN INCL (Properties, NonBaseComp); END;
  499.                   IF MultipleInheritedActions THEN INCL (Properties, MultInhComp); END;
  500.                END;
  501.             END;
  502.              END;
  503.           ELSIF Check THEN
  504. Tree.ErrorI (AttributeNotDeclared, t^.Designator.Pos, Errors.Ident, ADR (t^.Designator.Attribute));
  505.           END;
  506.            END;
  507.         ELSIF Check THEN
  508. Tree.ErrorI (SelectorNotDeclared, t^.Designator.Pos, Errors.Ident, ADR (t^.Designator.Selector));
  509.         END;
  510.         CompDP1 (t^.Designator.Next, Set, Usage, NonBase, Check);
  511.       | Tree. Ident :
  512.         Attribute := IdentifyAttribute (Class, t^.Ident.Attribute);
  513.         IF Attribute # NoTree THEN
  514.            Include (Set, Attribute^.Child.AttrIndex);
  515.            INCL (Attribute^.Child.Properties, Usage);
  516.            IF Usage = Write THEN
  517.           INCL (Attribute^.Child.Properties, Synthesized);
  518.           INCL (Class^.Class.Instance^ [Attribute^.Child.AttrIndex].Properties, Computed);
  519.           IF Inherited IN Attribute^.Child.Properties THEN
  520. Tree.ErrorI (SynthesizedUseOfInheritedAttribute, t^.Ident.Pos, Errors.Ident, ADR (t^.Ident.Attribute));
  521.           END;
  522.           WITH Class^.Class.Instance^ [Attribute^.Child.AttrIndex] DO
  523.              IF NonBase AND NOT MultipleInheritedActions AND (NonBaseComp IN Properties) AND
  524.             NOT (MultInhComp IN Properties) THEN
  525. Tree.ErrorI (AttributeMultipleComputed, t^.Ident.Pos, Errors.Ident, ADR (t^.Ident.Attribute));
  526.              END;
  527.              IF NOT MultipleInheritedActions OR (MultInhComp IN Properties) THEN
  528.             EXCL (Properties, MultInhComp);
  529.             IF NonBase THEN INCL (Properties, NonBaseComp); END;
  530.             IF MultipleInheritedActions THEN INCL (Properties, MultInhComp); END;
  531.              END;
  532.           END;
  533.            END;
  534.         ELSIF Check THEN
  535. Tree.ErrorI (AttributeNotDeclared, t^.Ident.Pos, Errors.Ident, ADR (t^.Ident.Attribute));
  536.         END;
  537.         CompDP1 (t^.Ident.Next, Set, Usage, NonBase, Check);
  538.       | Tree.Remote:
  539.         CompDP1 (t^.Remote.Designators, Set, Usage, NonBase, Check);
  540.         CompDP1 (t^.Remote.Next, Set, Usage, NonBase, Check);
  541.       | Tree.Any:
  542.         CompDP1 (t^.Any.Next, Set, Usage, NonBase, Check);
  543.       | Tree.Anys:
  544.         CompDP1 (t^.Anys.Next, Set, Usage, NonBase, Check);
  545.       | Tree.NoDesignator:
  546.       END;
  547.    END CompDP1;
  548.  
  549. PROCEDURE IsCode (t: tTree): BOOLEAN;
  550.    BEGIN
  551.       CASE t^.Kind OF
  552.       | Tree.Designator
  553.       , Tree.Ident
  554.       , Tree.Remote     : RETURN TRUE;
  555.       | Tree.Any     : RETURN IsCode (t^.Any.Next);
  556.       | Tree.Anys     : RETURN IsCode (t^.Anys.Next);
  557.       | Tree.NoDesignator: RETURN FALSE;
  558.       END;
  559.    END IsCode;
  560.  
  561. PROCEDURE CopyTree (t: tTree): tTree;
  562.    BEGIN
  563.       CASE t^.Kind OF
  564.       | Tree.Attribute: WITH t^.Attribute DO
  565.         RETURN mAttribute (CopyTree (Next), Name, Type, Properties, Pos);
  566.      END;
  567.       | Tree.Child: WITH t^.Child DO
  568.         RETURN mChild (CopyTree (Next), Name, Type, Properties, Pos);
  569.      END;
  570.       | Tree.ActionPart: WITH t^.ActionPart DO
  571.         RETURN mActionPart (CopyTree (Next), Actions);
  572.      END;
  573.       | Tree.NoAttribute:
  574.      RETURN nNoAttribute;
  575.       END;
  576.    END CopyTree;
  577.  
  578. PROCEDURE ExpandMultiple (Class: tTree);
  579.    VAR Node, class: tTree;
  580.    BEGIN
  581.       WITH Class^.Class DO
  582.      IF NOT (Mark IN Properties) THEN
  583.         INCL (Properties, Mark);
  584.         IF BaseClass^.Kind = Tree.Class THEN ExpandMultiple (BaseClass); END;
  585.         Node := Names;
  586.         WHILE Node^.Kind = Tree.Name DO
  587.            WITH Node^.Name DO
  588.           class := IdentifyClass (TreeRoot^.Ag.Classes, Name);
  589.           IF class # NoTree THEN
  590.              ExpandMultiple (class);
  591.              TheClass := Class;
  592.              ForallAttributes (class, ExpandMultiple2);
  593.           END;
  594.           Node := Next;
  595.            END;
  596.         END;
  597.         EXCL (Properties, Mark);
  598.      END;
  599.       END;
  600. END ExpandMultiple;
  601.  
  602. PROCEDURE AppendAttr (VAR Attributes: tTree; Attribute: tTree);
  603.    BEGIN
  604.       IF Attributes^.Kind = NoAttribute THEN
  605.      Attribute^.AttrOrAction.Next := Attributes;
  606.      Attributes := Attribute;
  607.       ELSE
  608.      AppendAttr (Attributes^.AttrOrAction.Next, Attribute);
  609.       END;
  610.    END AppendAttr;
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723. PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
  724.  BEGIN
  725.   IO.WriteS (IO.StdError, 'Error: module Semantics, routine ');
  726.   IO.WriteS (IO.StdError, yyFunction);
  727.   IO.WriteS (IO.StdError, ' failed');
  728.   IO.WriteNl (IO.StdError);
  729.   Exit;
  730.  END yyAbort;
  731.  
  732. PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
  733.  VAR yyi    : INTEGER;
  734.  BEGIN
  735.   FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
  736.    IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
  737.   END;
  738.   RETURN TRUE;
  739.  END yyIsEqual;
  740.  
  741. PROCEDURE Semantics (t: Tree.tTree);
  742.  VAR yyTempo: RECORD CASE : INTEGER OF
  743.  END; END;
  744.  BEGIN
  745.   IF t = Tree.NoTree THEN RETURN; END;
  746.   IF (t^.Kind = Tree.Ag) THEN
  747. (* line 617 "" *)
  748.      WITH t^.Ag DO
  749. (* line 617 "" *)
  750.       
  751.     InitIdentifyClass (Classes);
  752.     ForallClasses (Classes, StampItems);
  753.     StampItems (Modules);
  754.     ExpandProps (Props);
  755.     ExpandProps (Modules);
  756.     IF Ignore IN Properties THEN
  757.        ProcessIgnore (ParserCodes);
  758.        ProcessIgnore (TreeCodes);
  759.        ProcessIgnore (EvalCodes);
  760.     END;
  761.     ProcessIgnore (Decls);
  762.     ForallClasses (Classes, ProcessIgnore);
  763.     ProcessIgnore (Modules);
  764.     ExpandModules (Decls);
  765.     ExpandModules (Modules);
  766.       IF IsElement (ORD ('c'), Options) THEN
  767.     ArrayToString ("bool", String);
  768.       ELSE
  769.     ArrayToString ("BOOLEAN", String);
  770.       END;
  771.     Ident := MakeIdent (String);
  772.     TypeCount := MaxIdent ();
  773.     MakeSet (TypeNames, TypeCount);
  774.     Include (TypeNames, Ident);
  775.     Semantics (Classes);
  776. ;
  777.       RETURN;
  778.      END;
  779.  
  780.   END;
  781.   IF (t^.Kind = Tree.Class) THEN
  782. (* line 644 "" *)
  783.      WITH t^.Class DO
  784. (* line 644 "" *)
  785.       
  786.     CompBaseClass (t, nNoClass);            (* ast *)
  787.     ForallClasses (t, ExpandMultiple);
  788.     ClassCount := 0;
  789.     MakeSet (CodesUsed, MaxIdent ());
  790.     ForallClasses (t, CountClasses);
  791.     ForallClasses (t, CheckReverse);
  792.     INCL (t^.Class.Properties, Referenced);
  793.         CompReachable (t);
  794.  
  795.       IF IsElement (ORD ('x'), Options) OR
  796.      IsElement (ORD ('z'), Options) OR
  797.      IsElement (ORD ('u'), Options) THEN
  798.     TokenCode := 0;
  799.     ForallClasses (t, CodeTerminals);
  800.     ActionCount := 0;
  801.     i := 0;
  802.     CompParsIndex (t, i);
  803.     ForallClasses (t, CheckUsage2);
  804.       END;
  805.  
  806.     ForallClasses (t, ExpandChecks);
  807.     ForallClasses (t, Identify);
  808.     MakeSet (ClassNames, MaxIdent ());
  809.     MakeSet (SelectorNames, MaxIdent ());
  810.     MakeSet (VariantNames, MaxIdent ());
  811.     MakeSet (PrecNames, MaxIdent ());
  812.     CheckNames (TreeRoot^.Ag.Precs);
  813.     ForallClasses (t, CheckNames);
  814.     ReleaseSet (ClassNames);
  815.     ReleaseSet (SelectorNames);
  816.     ReleaseSet (VariantNames);
  817.     ReleaseSet (PrecNames);
  818.     ReleaseSet (CodesUsed);
  819.     ForallClasses (t, CheckDesignator);
  820.     CompBitCount (t, 1, i);
  821.     CompBitOffset (t, 0, i);
  822.  
  823.       IF IsElement (ORD ('.'), Options) THEN        (* ag *)
  824.     CompIndex (t, 0, i);
  825.     CompInstance (t, 0, i);
  826.     MakeSet (MaxSet, MaxInstCount);
  827.     Complement (MaxSet);
  828.         ForallClasses (t, InitInstance0);
  829.         ForallClasses (t, CompDP);
  830.       IF IsElement (ORD ('2'), Options) THEN
  831.     WriteNl (StdOutput);
  832.     WriteS (StdOutput, "Inherited Attribute Computation Rules"); WriteNl (StdOutput);
  833.     WriteS (StdOutput, "-------------------------------------"); WriteNl (StdOutput);
  834.     WriteNl (StdOutput);
  835.       END;
  836.         ForallClasses (t, CopyProperties);
  837.         ForallClasses (t, CheckInherited);
  838.       IF IsElement (ORD ('1'), Options) THEN
  839.     WriteNl (StdOutput);
  840.     WriteS (StdOutput, "Inserted Copy Rules"); WriteNl (StdOutput);
  841.     WriteS (StdOutput, "-------------------"); WriteNl (StdOutput);
  842.     WriteNl (StdOutput);
  843.       END;
  844.     Success := TRUE;
  845.         ForallClasses (t, CheckComplete);
  846.     IF Success THEN INCL (GrammarClass, cLNC); END;
  847.     IF CopyInherited > 0 THEN
  848. Tree.InformationI (CopyRuleInsertionsInherited, t^.Class.Pos, Errors.Integer, ADR (CopyInherited));
  849.     END;
  850.     IF CopySynthesized > 0 THEN
  851. Tree.InformationI (CopyRuleInsertionsSynthesized, t^.Class.Pos, Errors.Integer, ADR (CopySynthesized));
  852.     END;
  853.     IF CopyThreaded > 0 THEN
  854. Tree.InformationI (CopyRuleInsertionsThreaded, t^.Class.Pos, Errors.Integer, ADR (CopyThreaded));
  855.     END;
  856.         ForallClasses (t, CheckUsage);
  857.       END;
  858. ;
  859.       RETURN;
  860.      END;
  861.  
  862.   END;
  863.  END Semantics;
  864.  
  865. PROCEDURE StampItems (t: Tree.tTree);
  866.  VAR yyTempo: RECORD CASE : INTEGER OF
  867.  END; END;
  868.  BEGIN
  869.   IF t = Tree.NoTree THEN RETURN; END;
  870.   IF (t^.Kind = Tree.Module) THEN
  871. (* line 724 "" *)
  872.      WITH t^.Module DO
  873. (* line 724 "" *)
  874.       
  875.     ForallClasses (Classes, StampItems);
  876.     StampItems (Next);
  877. ;
  878.       RETURN;
  879.      END;
  880.  
  881.   END;
  882.   IF (t^.Kind = Tree.Class) THEN
  883. (* line 728 "" *)
  884.      WITH t^.Class DO
  885. (* line 728 "" *)
  886.       
  887.     IF Abstract IN Properties THEN
  888.        ForallAttributes (Attributes, StampItems);
  889.     END;
  890. ;
  891.       RETURN;
  892.      END;
  893.  
  894.   END;
  895.   IF (t^.Kind = Tree.Child) THEN
  896. (* line 733 "" *)
  897.      WITH t^.Child DO
  898. (* line 733 "" *)
  899.       
  900.     INC (ItemCount); Item := ItemCount;
  901. ;
  902.       RETURN;
  903.      END;
  904.  
  905.   END;
  906.   IF (t^.Kind = Tree.Attribute) THEN
  907. (* line 736 "" *)
  908.      WITH t^.Attribute DO
  909. (* line 736 "" *)
  910.       
  911.     INC (ItemCount); Item := ItemCount;
  912. ;
  913.       RETURN;
  914.      END;
  915.  
  916.   END;
  917.   IF (t^.Kind = Tree.ActionPart) THEN
  918. (* line 739 "" *)
  919.      WITH t^.ActionPart DO
  920. (* line 739 "" *)
  921.       
  922.     INC (ItemCount); Item := ItemCount;
  923. ;
  924.       RETURN;
  925.      END;
  926.  
  927.   END;
  928.  END StampItems;
  929.  
  930. PROCEDURE ExpandProps (t: Tree.tTree);
  931.  VAR yyTempo: RECORD CASE : INTEGER OF
  932.  END; END;
  933.  BEGIN
  934.   IF t = Tree.NoTree THEN RETURN; END;
  935.  
  936.   CASE t^.Kind OF
  937.   | Tree.Module:
  938. (* line 746 "" *)
  939.      WITH t^.Module DO
  940. (* line 746 "" *)
  941.       
  942.     ExpandProps (Props);
  943.     ExpandProps (Next);
  944. ;
  945.       RETURN;
  946.      END;
  947.  
  948.   | Tree.Prop:
  949. (* line 750 "" *)
  950.      WITH t^.Prop DO
  951. (* line 750 "" *)
  952.       
  953.     ActProperties := Properties;
  954.     ExpandProps (Names);
  955.     ExpandProps (Next);
  956. ;
  957.       RETURN;
  958.      END;
  959.  
  960.   | Tree.Select:
  961. (* line 755 "" *)
  962.      WITH t^.Select DO
  963. (* line 755 "" *)
  964.       
  965.     CheckSelect (Names);
  966.     ActProperties := {Ignore};
  967.     IF NOT LookUp (TreeRoot^.Ag.Name, Names) THEN
  968.        TreeRoot^.Ag.Properties := TreeRoot^.Ag.Properties + ActProperties;
  969.        ExpandProps (TreeRoot^.Ag.Decls);
  970.        ForallClasses (TreeRoot^.Ag.Classes, ExpandProps);
  971.     END;
  972.     Module := TreeRoot^.Ag.Modules;
  973.     WHILE Module^.Kind = Tree.Module DO
  974.        IF NOT LookUp (Module^.Module.Name, Names) THEN
  975.           Module^.Module.Properties := Module^.Module.Properties + ActProperties;
  976.           ExpandProps (Module^.Module.Decls);
  977.           ForallClasses (Module^.Module.Classes, ExpandProps);
  978.        END;
  979.        Module := Module^.Module.Next;
  980.     END;
  981.     ExpandProps (Next);
  982. ;
  983.       RETURN;
  984.      END;
  985.  
  986.   | Tree.Name:
  987. (* line 774 "" *)
  988.      WITH t^.Name DO
  989. (* line 774 "" *)
  990.       
  991.     IF Name = TreeRoot^.Ag.Name THEN
  992.        TreeRoot^.Ag.Properties := TreeRoot^.Ag.Properties + ActProperties;
  993.        ExpandProps (TreeRoot^.Ag.Decls);
  994.        ForallClasses (TreeRoot^.Ag.Classes, ExpandProps);
  995.     ELSE
  996.        Module := IdentifyModule (TreeRoot^.Ag.Modules, Name);
  997.        IF Module = NoTree THEN
  998. Tree.WarningI (ModuleNotDeclared, t^.Name.Pos, Errors.Ident, ADR (Name));
  999.        ELSE
  1000.           Module^.Module.Properties := Module^.Module.Properties + ActProperties;
  1001.           ExpandProps (Module^.Module.Decls);
  1002.           ForallClasses (Module^.Module.Classes, ExpandProps);
  1003.        END;
  1004.     END;
  1005.     ExpandProps (Next);
  1006. ;
  1007.       RETURN;
  1008.      END;
  1009.  
  1010.   | Tree.Decl:
  1011. (* line 791 "" *)
  1012.      WITH t^.Decl DO
  1013. (* line 791 "" *)
  1014.       
  1015.     ForallAttributes (Attributes, ExpandProps);
  1016.     ExpandProps (Next);
  1017. ;
  1018.       RETURN;
  1019.      END;
  1020.  
  1021.   | Tree.Class:
  1022. (* line 795 "" *)
  1023.      WITH t^.Class DO
  1024. (* line 795 "" *)
  1025.       
  1026.     Properties := Properties + ActProperties;
  1027.     ForallAttributes (Attributes, ExpandProps);
  1028. ;
  1029.       RETURN;
  1030.      END;
  1031.  
  1032.   | Tree.Child:
  1033. (* line 799 "" *)
  1034.      WITH t^.Child DO
  1035. (* line 799 "" *)
  1036.       
  1037.     Properties := Properties + ActProperties;
  1038. ;
  1039.       RETURN;
  1040.      END;
  1041.  
  1042.   | Tree.Attribute:
  1043. (* line 802 "" *)
  1044.      WITH t^.Attribute DO
  1045. (* line 802 "" *)
  1046.       
  1047.     Properties := Properties + ActProperties;
  1048. ;
  1049.       RETURN;
  1050.      END;
  1051.  
  1052.   | Tree.ActionPart:
  1053. (* line 805 "" *)
  1054.      WITH t^.ActionPart DO
  1055. (* line 805 "" *)
  1056.       
  1057.     Properties := Properties + ActProperties;
  1058. ;
  1059.       RETURN;
  1060.      END;
  1061.  
  1062.   ELSE END;
  1063.  
  1064.  END ExpandProps;
  1065.  
  1066. PROCEDURE CheckSelect (t: Tree.tTree);
  1067.  VAR yyTempo: RECORD CASE : INTEGER OF
  1068.  END; END;
  1069.  BEGIN
  1070.   IF t = Tree.NoTree THEN RETURN; END;
  1071.   IF (t^.Kind = Tree.Name) THEN
  1072. (* line 812 "" *)
  1073.      WITH t^.Name DO
  1074. (* line 812 "" *)
  1075.       
  1076.     IF NOT ((Name = TreeRoot^.Ag.Name) OR (IdentifyModule (TreeRoot^.Ag.Modules, Name) # NoTree)) THEN
  1077. Tree.WarningI (ModuleNotDeclared, t^.Name.Pos, Errors.Ident, ADR (Name));
  1078.     END;
  1079.     CheckSelect (Next);
  1080. ;
  1081.       RETURN;
  1082.      END;
  1083.  
  1084.   END;
  1085.  END CheckSelect;
  1086.  
  1087. PROCEDURE ProcessIgnore (t: Tree.tTree);
  1088.  VAR yyTempo: RECORD CASE : INTEGER OF
  1089.  END; END;
  1090.  BEGIN
  1091.   IF t = Tree.NoTree THEN RETURN; END;
  1092.   IF (t^.Kind = Tree.Module) THEN
  1093. (* line 822 "" *)
  1094.      WITH t^.Module DO
  1095. (* line 822 "" *)
  1096.       
  1097.     IF Ignore IN Properties THEN
  1098.        ProcessIgnore (ParserCodes);
  1099.        ProcessIgnore (TreeCodes);
  1100.        ProcessIgnore (EvalCodes);
  1101.     END;
  1102.     ProcessIgnore (Decls);
  1103.     ForallClasses (Classes, ProcessIgnore);
  1104.     ProcessIgnore (Next);
  1105. ;
  1106.       RETURN;
  1107.      END;
  1108.  
  1109.   END;
  1110.   IF (t^.Kind = Tree.Codes) THEN
  1111. (* line 832 "" *)
  1112.      WITH t^.Codes DO
  1113. (* line 832 "" *)
  1114.       
  1115.     MakeText (Export);
  1116.     MakeText (Import);
  1117.     MakeText (Global);
  1118.         MakeText (Local);
  1119.     MakeText (Begin);
  1120.     MakeText (Close);
  1121. ;
  1122.       RETURN;
  1123.      END;
  1124.  
  1125.   END;
  1126.   IF (t^.Kind = Tree.Decl) THEN
  1127. (* line 840 "" *)
  1128.      WITH t^.Decl DO
  1129. (* line 840 "" *)
  1130.       
  1131.     Attributes := ProcessIgnore2 (Attributes);
  1132.     ProcessIgnore (Next);
  1133. ;
  1134.       RETURN;
  1135.      END;
  1136.  
  1137.   END;
  1138.   IF (t^.Kind = Tree.Class) THEN
  1139. (* line 844 "" *)
  1140.      WITH t^.Class DO
  1141. (* line 844 "" *)
  1142.       
  1143.     Attributes := ProcessIgnore2 (Attributes);
  1144.     IF Ignore IN Properties THEN Names := nNoName; END;
  1145. ;
  1146.       RETURN;
  1147.      END;
  1148.  
  1149.   END;
  1150.  END ProcessIgnore;
  1151.  
  1152. PROCEDURE ExpandModules (t: Tree.tTree);
  1153.  VAR yyTempo: RECORD CASE : INTEGER OF
  1154.  END; END;
  1155.  BEGIN
  1156.   IF t = Tree.NoTree THEN RETURN; END;
  1157.   IF (t^.Kind = Tree.Module) THEN
  1158. (* line 852 "" *)
  1159.      WITH t^.Module DO
  1160. (* line 852 "" *)
  1161.       
  1162.     ExpandModules (Decls);
  1163.     ExpandModules (Classes);
  1164.     ExpandModules (Next);
  1165. ;
  1166.       RETURN;
  1167.      END;
  1168.  
  1169.   END;
  1170.   IF (t^.Kind = Tree.Decl) THEN
  1171. (* line 857 "" *)
  1172.      WITH t^.Decl DO
  1173. (* line 857 "" *)
  1174.       
  1175.     Attribute    := Attributes;
  1176.     ActProperties    := Properties;
  1177.     ExpandModules (Names);
  1178.     ExpandModules (Next);
  1179. ;
  1180.       RETURN;
  1181.      END;
  1182.  
  1183.   END;
  1184.   IF (t^.Kind = Tree.Name) THEN
  1185. (* line 863 "" *)
  1186.      WITH t^.Name DO
  1187. (* line 863 "" *)
  1188.       
  1189.     Class := IdentifyClass (TreeRoot^.Ag.Classes, Name);
  1190.     IF Class = NoTree THEN
  1191.        IF TreeRoot^.Ag.Classes^.Kind = Tree.NoClass THEN
  1192.           TreeRoot^.Ag.Classes := mClass (Name, ActProperties, CopyTree (Attribute),
  1193.          nNoClass, TreeRoot^.Ag.Classes, Name, Pos, 0, NoIdent, nNoName);
  1194.           InitIdentifyClass2 (TreeRoot^.Ag.Classes);
  1195.        ELSE
  1196.           Node := TreeRoot^.Ag.Classes;
  1197.           WHILE Node^.Class.Next^.Kind # Tree.NoClass DO
  1198.          Node := Node^.Class.Next;
  1199.           END;
  1200.           Node^.Class.Next := mClass (Name, ActProperties, CopyTree (Attribute),
  1201.          nNoClass, Node^.Class.Next, Name, Pos, 0, NoIdent, nNoName);
  1202.           InitIdentifyClass2 (Node^.Class.Next);
  1203.        END;
  1204.     ELSE
  1205.        IF Class^.Class.Attributes^.Kind = Tree.NoAttribute THEN
  1206.           Class^.Class.Attributes := CopyTree (Attribute);
  1207.        ELSE
  1208.           Node := Class^.Class.Attributes;
  1209.           WHILE Node^.Attribute.Next^.Kind # Tree.NoAttribute DO
  1210.          Node := Node^.Attribute.Next;
  1211.           END;
  1212.           Node^.Attribute.Next := CopyTree (Attribute);
  1213.        END;
  1214.     END;
  1215.     ExpandModules (Next);
  1216. ;
  1217.       RETURN;
  1218.      END;
  1219.  
  1220.   END;
  1221.   IF (t^.Kind = Tree.Class) THEN
  1222. (* line 892 "" *)
  1223.      WITH t^.Class DO
  1224. (* line 892 "" *)
  1225.       
  1226.     Class := IdentifyClass (TreeRoot^.Ag.Classes, Name);
  1227.     ForallClasses (Extensions, InitIdentifyClass2);
  1228.     IF Class = NoTree THEN
  1229.        IF TreeRoot^.Ag.Classes^.Kind = Tree.NoClass THEN
  1230.           TreeRoot^.Ag.Classes := mClass (Name, Properties, Attributes, Extensions,
  1231.          TreeRoot^.Ag.Classes, Selector, Pos, Code, Prec, Names);
  1232.           InitIdentifyClass2 (TreeRoot^.Ag.Classes);
  1233.        ELSE
  1234.           Node := TreeRoot^.Ag.Classes;
  1235.           WHILE Node^.Class.Next^.Kind # Tree.NoClass DO
  1236.          Node := Node^.Class.Next;
  1237.           END;
  1238.           Node^.Class.Next := mClass (Name, Properties, Attributes, Extensions,
  1239.          Node^.Class.Next, Selector, Pos, Code, Prec, Names);
  1240.           InitIdentifyClass2 (Node^.Class.Next);
  1241.        END;
  1242.     ELSE
  1243.        IF Class^.Class.Attributes^.Kind = Tree.NoAttribute THEN
  1244.           Class^.Class.Attributes := Attributes;
  1245.        ELSE
  1246.           Node := Class^.Class.Attributes;
  1247.           WHILE Node^.Attribute.Next^.Kind # Tree.NoAttribute DO
  1248.          Node := Node^.Attribute.Next;
  1249.           END;
  1250.           Node^.Attribute.Next := Attributes;
  1251.        END;
  1252.  
  1253.        IF Class^.Class.Extensions^.Kind = Tree.NoClass THEN
  1254.           Class^.Class.Extensions := Extensions;
  1255.        ELSE
  1256.           Node := Class^.Class.Extensions;
  1257.           WHILE Node^.Class.Next^.Kind # Tree.NoClass DO
  1258.          Node := Node^.Class.Next;
  1259.           END;
  1260.           Node^.Class.Next := Extensions;
  1261.        END;
  1262.  
  1263.        IF Class^.Class.Names^.Kind = Tree.NoName THEN
  1264.           Class^.Class.Names := Names;
  1265.        ELSE
  1266.           Node := Class^.Class.Names;
  1267.           WHILE Node^.Name.Next^.Kind # Tree.NoName DO
  1268.          Node := Node^.Name.Next;
  1269.           END;
  1270.           Node^.Name.Next := Names;
  1271.        END;
  1272.     END;
  1273.     ExpandModules (Next);
  1274. ;
  1275.       RETURN;
  1276.      END;
  1277.  
  1278.   END;
  1279.  END ExpandModules;
  1280.  
  1281. PROCEDURE ExpandChecks (t: Tree.tTree);
  1282.  VAR yyTempo: RECORD CASE : INTEGER OF
  1283.  END; END;
  1284.  BEGIN
  1285.   IF t = Tree.NoTree THEN RETURN; END;
  1286.  
  1287.   CASE t^.Kind OF
  1288.   | Tree.Class:
  1289. (* line 946 "" *)
  1290.      WITH t^.Class DO
  1291. (* line 946 "" *)
  1292.       
  1293.     Class := t;
  1294.     ExpandChecks (Attributes);
  1295.     IF (BaseClass^.Kind = Tree.NoClass) THEN    (* Top ? *)
  1296.        Attributes := mAttribute (Attributes, iNull, iNull, {Synthesized, Computed, Dummy}, NoPosition);
  1297.     END;
  1298. ;
  1299.       RETURN;
  1300.      END;
  1301.  
  1302.   | Tree.Child:
  1303. (* line 953 "" *)
  1304.      WITH t^.Child DO
  1305. (* line 953 "" *)
  1306.       
  1307.     ExpandChecks (Next);
  1308. ;
  1309.       RETURN;
  1310.      END;
  1311.  
  1312.   | Tree.Attribute:
  1313. (* line 956 "" *)
  1314.      WITH t^.Attribute DO
  1315. (* line 956 "" *)
  1316.       
  1317.     ExpandChecks (Next);
  1318. ;
  1319.       RETURN;
  1320.      END;
  1321.  
  1322.   | Tree.ActionPart:
  1323. (* line 959 "" *)
  1324.      WITH t^.ActionPart DO
  1325. (* line 959 "" *)
  1326.       
  1327.     ExpandChecks (Actions);
  1328.     ExpandChecks (Next);
  1329. ;
  1330.       RETURN;
  1331.      END;
  1332.  
  1333.   | Tree.Assign:
  1334. (* line 963 "" *)
  1335.      WITH t^.Assign DO
  1336. (* line 963 "" *)
  1337.       
  1338.     ExpandChecks (Next);
  1339. ;
  1340.       RETURN;
  1341.      END;
  1342.  
  1343.   | Tree.Copy:
  1344. (* line 966 "" *)
  1345.      WITH t^.Copy DO
  1346. (* line 966 "" *)
  1347.       
  1348.     ExpandChecks (Next);
  1349. ;
  1350.       RETURN;
  1351.      END;
  1352.  
  1353.   | Tree.TargetCode:
  1354. (* line 969 "" *)
  1355.      WITH t^.TargetCode DO
  1356. (* line 969 "" *)
  1357.       
  1358.     ExpandChecks (Next);
  1359. ;
  1360.       RETURN;
  1361.      END;
  1362.  
  1363.   | Tree.Order:
  1364. (* line 972 "" *)
  1365.      WITH t^.Order DO
  1366. (* line 972 "" *)
  1367.       
  1368.     ExpandChecks (Next);
  1369. ;
  1370.       RETURN;
  1371.      END;
  1372.  
  1373.   | Tree.Check:
  1374. (* line 975 "" *)
  1375.      WITH t^.Check DO
  1376. (* line 975 "" *)
  1377.       
  1378.     IF Results = NoTree THEN
  1379.        INC (ChecksCount);
  1380.        IntToString (ChecksCount, String);
  1381.        Ident := MakeIdent (String);
  1382.        Class^.Class.Attributes := mAttribute (Class^.Class.Attributes, Ident, Ident,
  1383.           {Test}, NoPosition);
  1384.        Results := mIdent (Ident, NoPosition, nNoDesignator);
  1385.     ELSE
  1386.        Class^.Class.Attributes := mAttribute (Class^.Class.Attributes,
  1387.           Results^.Ident.Attribute, Results^.Ident.Attribute, {Test}, NoPosition);
  1388.     END;
  1389.     ExpandChecks (Next);
  1390. ;
  1391.       RETURN;
  1392.      END;
  1393.  
  1394.   ELSE END;
  1395.  
  1396.  END ExpandChecks;
  1397.  
  1398. PROCEDURE ExpandMultiple2 (t: Tree.tTree);
  1399.  VAR yyTempo: RECORD CASE : INTEGER OF
  1400.  END; END;
  1401.  BEGIN
  1402.   IF t = Tree.NoTree THEN RETURN; END;
  1403.   IF (t^.Kind = Tree.Child) THEN
  1404. (* line 993 "" *)
  1405.      WITH t^.Child DO
  1406. (* line 993 "" *)
  1407.       
  1408.     IF NOT HasItem (TheClass, Item) THEN
  1409.        Node := mChild (NoTree, Name, Type, Properties, Pos);
  1410.        Node^.AttrOrAction.Item := Item;
  1411.        AppendAttr (TheClass^.Class.Attributes, Node);
  1412.     END;
  1413. ;
  1414.       RETURN;
  1415.      END;
  1416.  
  1417.   END;
  1418.   IF (t^.Kind = Tree.Attribute) THEN
  1419. (* line 1000 "" *)
  1420.      WITH t^.Attribute DO
  1421. (* line 1000 "" *)
  1422.       
  1423.     IF NOT HasItem (TheClass, Item) THEN
  1424.        Node := mAttribute (NoTree, Name, Type, Properties, Pos);
  1425.        Node^.AttrOrAction.Item := Item;
  1426.        AppendAttr (TheClass^.Class.Attributes, Node);
  1427.     END;
  1428. ;
  1429.       RETURN;
  1430.      END;
  1431.  
  1432.   END;
  1433.   IF (t^.Kind = Tree.ActionPart) THEN
  1434. (* line 1007 "" *)
  1435.      WITH t^.ActionPart DO
  1436. (* line 1007 "" *)
  1437.       
  1438.     IF NOT HasItem (TheClass, Item) THEN
  1439.        Node := mActionPart (NoTree, Actions);
  1440.        Node^.AttrOrAction.Item := Item;
  1441.        INCL (Node^.ActionPart.Properties, MultInhComp);
  1442.        AppendAttr (TheClass^.Class.Attributes, Node);
  1443.     END;
  1444. ;
  1445.       RETURN;
  1446.      END;
  1447.  
  1448.   END;
  1449.  END ExpandMultiple2;
  1450.  
  1451. PROCEDURE CountClasses (t: Tree.tTree);
  1452.  VAR yyTempo: RECORD CASE : INTEGER OF
  1453.  END; END;
  1454.  BEGIN
  1455.   IF t = Tree.NoTree THEN RETURN; END;
  1456.   IF (t^.Kind = Tree.Class) THEN
  1457. (* line 1019 "" *)
  1458.      WITH t^.Class DO
  1459. (* line 1019 "" *)
  1460.       
  1461.     IF NOT (Abstract IN Properties) THEN INC (ClassCount); END;
  1462.     ChildCount    := 0;
  1463.     AttributeCount    := 0;
  1464.     ActionCount    := 0;
  1465.     Class := t;
  1466.     ForallAttributes (t, CountClasses);
  1467.     IF ChildCount      > 0 THEN INCL (t^.Class.Properties, HasChildren    ); END;
  1468.     IF AttributeCount > 0 THEN INCL (t^.Class.Properties, HasAttributes    ); END;
  1469.     IF ActionCount      > 0 THEN INCL (t^.Class.Properties, HasActions    ); END;
  1470.     IF (Terminal IN Properties) AND (Code # 0) THEN
  1471.        IF IsElement (Code, CodesUsed) THEN
  1472. Tree.ErrorI (TerminalCodeMultipleUsed, t^.Class.Pos, Errors.Integer, ADR (Code));
  1473.        END;
  1474.        Include (CodesUsed, Code);
  1475.     END;
  1476. ;
  1477.       RETURN;
  1478.      END;
  1479.  
  1480.   END;
  1481.   IF (t^.Kind = Tree.Child) THEN
  1482. (* line 1036 "" *)
  1483.      WITH t^.Child DO
  1484. (* line 1036 "" *)
  1485.       
  1486.     INC (ChildCount);
  1487. ;
  1488.       RETURN;
  1489.      END;
  1490.  
  1491.   END;
  1492.   IF (t^.Kind = Tree.Attribute) THEN
  1493. (* line 1039 "" *)
  1494.      WITH t^.Attribute DO
  1495. (* line 1039 "" *)
  1496.       
  1497.     IF (NoCodeAttr * Properties) = {} THEN 
  1498.        Include (TypeNames, Type);
  1499.        IF (Nonterminal IN Class^.Class.Properties) OR (Name # iPosition) THEN
  1500.           INC (AttributeCount);
  1501.        END;
  1502.     END;
  1503. ;
  1504.       RETURN;
  1505.      END;
  1506.  
  1507.   END;
  1508.   IF (t^.Kind = Tree.ActionPart) THEN
  1509. (* line 1047 "" *)
  1510.      WITH t^.ActionPart DO
  1511. (* line 1047 "" *)
  1512.       
  1513.     INC (ActionCount);
  1514. ;
  1515.       RETURN;
  1516.      END;
  1517.  
  1518.   END;
  1519.  END CountClasses;
  1520.  
  1521. PROCEDURE CompReachable (t: Tree.tTree);
  1522.  VAR yyTempo: RECORD CASE : INTEGER OF
  1523.  END; END;
  1524.  BEGIN
  1525.   IF t = Tree.NoTree THEN RETURN; END;
  1526.   IF (t^.Kind = Tree.Class) THEN
  1527. (* line 1054 "" *)
  1528.    LOOP
  1529.      WITH t^.Class DO
  1530. (* line 1055 "" *)
  1531.       IF NOT (NOT (Reachable IN Properties)) THEN EXIT; END;
  1532. (* line 1056 "" *)
  1533.       INCL (Properties, Reachable);
  1534. (* line 1057 "" *)
  1535.       ForallAttributes (Attributes, CompReachable);
  1536. (* line 1058 "" *)
  1537.       ForallClasses (Extensions, CompReachable);
  1538.       RETURN;
  1539.      END;
  1540.    END;
  1541.  
  1542.   END;
  1543.   IF (t^.Kind = Tree.Child) THEN
  1544. (* line 1060 "" *)
  1545.      WITH t^.Child DO
  1546. (* line 1060 "" *)
  1547.       
  1548.     Class := IdentifyClass (TreeRoot^.Ag.Classes, Type);
  1549.     IF Class # NoTree THEN
  1550.        INCL (Class^.Class.Properties, Referenced);
  1551.        CompReachable (Class);
  1552.     ELSE
  1553.       IF NOT IsElement (ORD ('j'), Options) THEN
  1554. Tree.WarningI (NodeTypeNotDeclared, t^.Child.Pos, Errors.Ident, ADR (Type));
  1555.       END;
  1556.        IF TreeRoot^.Ag.Classes^.Kind = Tree.NoClass THEN
  1557.           TreeRoot^.Ag.Classes := mClass (Type, {Terminal, Implicit, Reachable, Referenced},
  1558.          nNoAttribute, nNoClass, TreeRoot^.Ag.Classes, Type, Pos, 0, NoIdent, nNoName);
  1559.           InitIdentifyClass2 (TreeRoot^.Ag.Classes);
  1560.           TreeRoot^.Ag.Classes^.Class.BaseClass := nNoClass;
  1561.           Class := TreeRoot^.Ag.Classes;
  1562.        ELSE
  1563.           Node := TreeRoot^.Ag.Classes;
  1564.           WHILE Node^.Class.Next^.Kind # Tree.NoClass DO
  1565.          Node := Node^.Class.Next;
  1566.           END;
  1567.           Node^.Class.Next := mClass (Type, {Terminal, Implicit, Reachable, Referenced},
  1568.          nNoAttribute, nNoClass, Node^.Class.Next, Type, Pos, 0, NoIdent, nNoName);
  1569.           InitIdentifyClass2 (Node^.Class.Next);
  1570.           Node^.Class.Next^.Class.BaseClass := nNoClass;
  1571.           Class := Node^.Class.Next;
  1572.        END;
  1573.        INC (ClassCount);
  1574.     END;
  1575. ;
  1576.       RETURN;
  1577.      END;
  1578.  
  1579.   END;
  1580.  END CompReachable;
  1581.  
  1582. PROCEDURE CodeTerminals (t: Tree.tTree);
  1583.  VAR yyTempo: RECORD CASE : INTEGER OF
  1584.  END; END;
  1585.  BEGIN
  1586.   IF t = Tree.NoTree THEN RETURN; END;
  1587.   IF (t^.Kind = Tree.Class) THEN
  1588. (* line 1093 "" *)
  1589.      WITH t^.Class DO
  1590. (* line 1093 "" *)
  1591.       
  1592.     IF ({Terminal, Referenced} <= Properties) AND (Code = 0) THEN
  1593.        REPEAT INC (TokenCode); UNTIL NOT IsElement (TokenCode, CodesUsed);
  1594.        Code := TokenCode;
  1595.     END;
  1596.     IF (Terminal IN Properties) AND (BaseClass^.Kind = Tree.NoClass) THEN    (* Top ? *)
  1597.        Attributes := mAttribute (Attributes, iPosition, itPosition, {Synthesized, Computed, Input, Read}, NoPosition);
  1598.     END;
  1599. ;
  1600.       RETURN;
  1601.      END;
  1602.  
  1603.   END;
  1604.  END CodeTerminals;
  1605.  
  1606. PROCEDURE CheckReverse (t: Tree.tTree);
  1607.  VAR yyTempo: RECORD CASE : INTEGER OF
  1608.  END; END;
  1609.  BEGIN
  1610.   IF t = Tree.NoTree THEN RETURN; END;
  1611.   IF (t^.Kind = Tree.Class) THEN
  1612. (* line 1106 "" *)
  1613.      WITH t^.Class DO
  1614. (* line 1106 "" *)
  1615.       
  1616.     IF Extensions^.Kind = Tree.NoClass THEN        (* Low ? *)
  1617.        ReverseCount := 0;
  1618.        ForallAttributes (t, CheckReverse);
  1619.     END;
  1620. ;
  1621.       RETURN;
  1622.      END;
  1623.  
  1624.   END;
  1625.   IF (t^.Kind = Tree.Child) THEN
  1626. (* line 1112 "" *)
  1627.      WITH t^.Child DO
  1628. (* line 1112 "" *)
  1629.       
  1630.      IF Reverse IN Properties THEN
  1631.         INC (ReverseCount);
  1632.         IF ReverseCount > 1 THEN
  1633. Tree.Error (OnlyOneReverseInNodeType, t^.Child.Pos);
  1634.         END;
  1635.      END;
  1636. ;
  1637.       RETURN;
  1638.      END;
  1639.  
  1640.   END;
  1641.  END CheckReverse;
  1642.  
  1643. PROCEDURE CheckNames (t: Tree.tTree);
  1644.  VAR yyTempo: RECORD CASE : INTEGER OF
  1645.  END; END;
  1646.  BEGIN
  1647.   IF t = Tree.NoTree THEN RETURN; END;
  1648.  
  1649.   CASE t^.Kind OF
  1650.   | Tree.Class:
  1651. (* line 1124 "" *)
  1652.      WITH t^.Class DO
  1653. (* line 1124 "" *)
  1654.       
  1655.     IF IsElement (Name, ClassNames) THEN
  1656. Tree.ErrorI (NodeTypeMultipleDeclared, t^.Class.Pos, Errors.Ident, ADR (Name));
  1657.     END;
  1658.     Include (ClassNames, Name);
  1659.     IF Terminal IN Properties THEN
  1660.        IF IsElement (Selector, VariantNames) THEN
  1661. Tree.ErrorI (VariantSelectorMultipleDeclared, t^.Class.Pos, Errors.Ident, ADR (Selector));
  1662.        END;
  1663.        Include (VariantNames, Selector);
  1664.     END;
  1665.     IF (Prec # NoIdent) AND NOT IsElement (Prec, PrecNames) THEN
  1666. Tree.ErrorI (PrecedenceNotDeclared, t^.Class.Pos, Errors.Ident, ADR (Prec));
  1667.     END;
  1668.     IF Extensions^.Kind = Tree.NoClass THEN        (* Low ? *)
  1669.        AssignEmpty (SelectorNames);
  1670.        ForallAttributes (t, CheckNames);
  1671.     END;
  1672.     CheckNames2 (Names);
  1673. ;
  1674.       RETURN;
  1675.      END;
  1676.  
  1677.   | Tree.Child:
  1678. (* line 1144 "" *)
  1679.      WITH t^.Child DO
  1680. (* line 1144 "" *)
  1681.       
  1682.     IF IsElement (Name, SelectorNames) THEN
  1683.        IF NOT (IsElement (ORD ('x'), Options) OR
  1684.            IsElement (ORD ('z'), Options) OR
  1685.            IsElement (ORD ('u'), Options)) THEN
  1686. Tree.ErrorI (SelectorMultipleDeclared, t^.Child.Pos, Errors.Ident, ADR (Name));
  1687.        END;
  1688.     END;
  1689.     Include (SelectorNames, Name);
  1690. ;
  1691.       RETURN;
  1692.      END;
  1693.  
  1694.   | Tree.Attribute:
  1695. (* line 1154 "" *)
  1696.      WITH t^.Attribute DO
  1697. (* line 1154 "" *)
  1698.       
  1699.     IF IsElement (Name, SelectorNames) THEN
  1700. Tree.ErrorI (SelectorMultipleDeclared, t^.Attribute.Pos, Errors.Ident, ADR (Name));
  1701.     END;
  1702.     Include (SelectorNames, Name);
  1703. ;
  1704.       RETURN;
  1705.      END;
  1706.  
  1707.   | Tree.LeftAssoc:
  1708. (* line 1160 "" *)
  1709.      WITH t^.LeftAssoc DO
  1710. (* line 1160 "" *)
  1711.       
  1712.     CheckNames (Names);
  1713.     CheckNames (Next);
  1714. ;
  1715.       RETURN;
  1716.      END;
  1717.  
  1718.   | Tree.RightAssoc:
  1719. (* line 1164 "" *)
  1720.      WITH t^.RightAssoc DO
  1721. (* line 1164 "" *)
  1722.       
  1723.     CheckNames (Names);
  1724.     CheckNames (Next);
  1725. ;
  1726.       RETURN;
  1727.      END;
  1728.  
  1729.   | Tree.NonAssoc:
  1730. (* line 1168 "" *)
  1731.      WITH t^.NonAssoc DO
  1732. (* line 1168 "" *)
  1733.       
  1734.     CheckNames (Names);
  1735.     CheckNames (Next);
  1736. ;
  1737.       RETURN;
  1738.      END;
  1739.  
  1740.   | Tree.Name:
  1741. (* line 1172 "" *)
  1742.      WITH t^.Name DO
  1743. (* line 1172 "" *)
  1744.       
  1745.     IF IsElement (Name, PrecNames) THEN
  1746. Tree.ErrorI (PrecedenceMultipleDeclared, t^.Name.Pos, Errors.Ident, ADR (Name));
  1747.     END;
  1748.     Include (PrecNames, Name);
  1749.     CheckNames (Next);
  1750. ;
  1751.       RETURN;
  1752.      END;
  1753.  
  1754.   ELSE END;
  1755.  
  1756.  END CheckNames;
  1757.  
  1758. PROCEDURE CheckNames2 (t: Tree.tTree);
  1759.  VAR yyTempo: RECORD CASE : INTEGER OF
  1760.  END; END;
  1761.  BEGIN
  1762.   IF t = Tree.NoTree THEN RETURN; END;
  1763.   IF (t^.Kind = Tree.Name) THEN
  1764. (* line 1183 "" *)
  1765.      WITH t^.Name DO
  1766. (* line 1183 "" *)
  1767.       
  1768.     Class := IdentifyClass (TreeRoot^.Ag.Classes, Name);
  1769.     IF Class = NoTree THEN
  1770. Tree.ErrorI (NodeTypeNotDeclared, t^.Name.Pos, Errors.Ident, ADR (Name));
  1771.     ELSE
  1772.        IF NOT (Abstract IN Class^.Class.Properties) THEN
  1773. Tree.Error (AbstractTypeRequired, t^.Name.Pos);
  1774.        END;
  1775.     END;
  1776.     CheckNames2 (Next);
  1777. ;
  1778.       RETURN;
  1779.      END;
  1780.  
  1781.   END;
  1782.  END CheckNames2;
  1783.  
  1784. PROCEDURE CheckDesignator (t: Tree.tTree);
  1785.  VAR yyTempo: RECORD CASE : INTEGER OF
  1786.  END; END;
  1787.  BEGIN
  1788.   IF t = Tree.NoTree THEN RETURN; END;
  1789.  
  1790.   CASE t^.Kind OF
  1791.   | Tree.Class:
  1792. (* line 1198 "" *)
  1793.      WITH t^.Class DO
  1794. (* line 1198 "" *)
  1795.       
  1796.     Class := t;
  1797.     ForallAttributes (Attributes, CheckDesignator);
  1798. ;
  1799.       RETURN;
  1800.      END;
  1801.  
  1802.   | Tree.ActionPart:
  1803. (* line 1202 "" *)
  1804.      WITH t^.ActionPart DO
  1805. (* line 1202 "" *)
  1806.       
  1807.     CheckDesignator (Actions);
  1808. ;
  1809.       RETURN;
  1810.      END;
  1811.  
  1812.   | Tree.Assign:
  1813. (* line 1205 "" *)
  1814.      WITH t^.Assign DO
  1815. (* line 1205 "" *)
  1816.       
  1817.     CheckDesignator (Results);
  1818.     CheckDesignator (Arguments);
  1819.     CheckDesignator (Next);
  1820. ;
  1821.       RETURN;
  1822.      END;
  1823.  
  1824.   | Tree.Copy:
  1825. (* line 1210 "" *)
  1826.      WITH t^.Copy DO
  1827. (* line 1210 "" *)
  1828.       
  1829.     CheckDesignator (Results);
  1830.     CheckDesignator (Arguments);
  1831.     CheckDesignator (Next);
  1832. ;
  1833.       RETURN;
  1834.      END;
  1835.  
  1836.   | Tree.TargetCode:
  1837. (* line 1215 "" *)
  1838.      WITH t^.TargetCode DO
  1839. (* line 1215 "" *)
  1840.       
  1841.     CheckDesignator (Code);
  1842.     CheckDesignator (Next);
  1843. ;
  1844.       RETURN;
  1845.      END;
  1846.  
  1847.   | Tree.Check:
  1848. (* line 1219 "" *)
  1849.      WITH t^.Check DO
  1850. (* line 1219 "" *)
  1851.       
  1852.     CheckDesignator (Statement);
  1853.     CheckDesignator (Condition);
  1854.     CheckDesignator (Actions);
  1855.     CheckDesignator (Next);
  1856. ;
  1857.       RETURN;
  1858.      END;
  1859.  
  1860.   | Tree.Designator:
  1861. (* line 1225 "" *)
  1862.      WITH t^.Designator DO
  1863. (* line 1225 "" *)
  1864.       
  1865.     Node := IdentifyAttribute (Class, Selector);
  1866.     IF Node # NoTree THEN
  1867.        IF Node^.Kind # Tree.Child THEN
  1868. Tree.Error (ChildRequired, t^.Designator.Pos);
  1869.        ELSE
  1870.           IF Node^.Child.Class # NoTree THEN
  1871.          Node := IdentifyAttribute (Node^.Child.Class, Attribute);
  1872.          IF Node = NoTree THEN
  1873. Tree.ErrorI (AttributeNotDeclared, t^.Designator.Pos, Errors.Ident, ADR (Attribute));
  1874.          END;
  1875.           END;
  1876.        END;
  1877.     ELSE
  1878. Tree.ErrorI (SelectorNotDeclared, t^.Designator.Pos, Errors.Ident, ADR (Selector));
  1879.     END;
  1880.     CheckDesignator (Next);
  1881. ;
  1882.       RETURN;
  1883.      END;
  1884.  
  1885.   | Tree.Remote:
  1886. (* line 1243 "" *)
  1887.      WITH t^.Remote DO
  1888. (* line 1243 "" *)
  1889.       
  1890.    Node := IdentifyClass (TreeRoot^.Ag.Classes, Type);
  1891.    IF Node = NoTree THEN
  1892. Tree.ErrorI (NodeTypeNotDeclared, t^.Remote.Pos, Errors.Ident, ADR (Type));
  1893.    ELSE
  1894.       Node := IdentifyAttribute (Node, Attribute);
  1895.       IF Node = NoTree THEN
  1896. Tree.ErrorI (AttributeNotDeclared, t^.Remote.Pos, Errors.Ident, ADR (Attribute));
  1897.       END;
  1898.    END;
  1899. ;
  1900. (* line 1254 "" *)
  1901.       CheckDesignator (Designators);
  1902. (* line 1255 "" *)
  1903.       CheckDesignator (Next);
  1904.       RETURN;
  1905.      END;
  1906.  
  1907.   | Tree.Order:
  1908. (* line 1257 "" *)
  1909.      WITH t^.Order DO
  1910. (* line 1261 "" *)
  1911.       CheckDesignator (Next);
  1912.       RETURN;
  1913.      END;
  1914.  
  1915.   | Tree.Ident:
  1916. (* line 1257 "" *)
  1917.      WITH t^.Ident DO
  1918. (* line 1261 "" *)
  1919.       CheckDesignator (Next);
  1920.       RETURN;
  1921.      END;
  1922.  
  1923.   | Tree.Any:
  1924. (* line 1257 "" *)
  1925.      WITH t^.Any DO
  1926. (* line 1261 "" *)
  1927.       CheckDesignator (Next);
  1928.       RETURN;
  1929.      END;
  1930.  
  1931.   | Tree.Anys:
  1932. (* line 1257 "" *)
  1933.      WITH t^.Anys DO
  1934. (* line 1261 "" *)
  1935.       CheckDesignator (Next);
  1936.       RETURN;
  1937.      END;
  1938.  
  1939.   | Tree.LayoutAny:
  1940. (* line 1257 "" *)
  1941.      WITH t^.LayoutAny DO
  1942. (* line 1261 "" *)
  1943.       CheckDesignator (Next);
  1944.       RETURN;
  1945.      END;
  1946.  
  1947.   ELSE END;
  1948.  
  1949.  END CheckDesignator;
  1950.  
  1951. PROCEDURE Identify (t: Tree.tTree);
  1952.  VAR yyTempo: RECORD CASE : INTEGER OF
  1953.  END; END;
  1954.  BEGIN
  1955.   IF t = Tree.NoTree THEN RETURN; END;
  1956.   IF (t^.Kind = Tree.Class) THEN
  1957. (* line 1268 "" *)
  1958.      WITH t^.Class DO
  1959. (* line 1268 "" *)
  1960.       
  1961.     ForallAttributes (t, Identify);
  1962. ;
  1963.       RETURN;
  1964.      END;
  1965.  
  1966.   END;
  1967.   IF (t^.Kind = Tree.Child) THEN
  1968. (* line 1271 "" *)
  1969.      WITH t^.Child DO
  1970. (* line 1271 "" *)
  1971.       
  1972.     Class := IdentifyClass (TreeRoot^.Ag.Classes, Type);
  1973.     IF (Class = NoTree) AND NOT IsElement (ORD ('x'), Options) AND
  1974.                 NOT IsElement (ORD ('z'), Options) AND
  1975.                 NOT IsElement (ORD ('u'), Options) THEN
  1976. Tree.ErrorI (NodeTypeNotDeclared, t^.Child.Pos, Errors.Ident, ADR (Type));
  1977.     END;
  1978. ;
  1979.       RETURN;
  1980.      END;
  1981.  
  1982.   END;
  1983.  END Identify;
  1984.  
  1985. PROCEDURE InitInstance0 (t: Tree.tTree);
  1986.  VAR yyTempo: RECORD CASE : INTEGER OF
  1987.  END; END;
  1988.  BEGIN
  1989.   IF t = Tree.NoTree THEN RETURN; END;
  1990.   IF (t^.Kind = Tree.Class) THEN
  1991. (* line 1283 "" *)
  1992.      WITH t^.Class DO
  1993. (* line 1283 "" *)
  1994.       
  1995.     InstanceSize := InstCount;
  1996.     MakeArray (Instance, InstanceSize, TSIZE (tInstance));
  1997.     InitInstance (t, AttrCount, Instance);
  1998. ;
  1999.       RETURN;
  2000.      END;
  2001.  
  2002.   END;
  2003.  END InitInstance0;
  2004.  
  2005. PROCEDURE CompDP (t: Tree.tTree);
  2006.  VAR yyTempo: RECORD CASE : INTEGER OF
  2007.  END; END;
  2008.  BEGIN
  2009.   IF t = Tree.NoTree THEN RETURN; END;
  2010.   IF (t^.Kind = Tree.Class) THEN
  2011. (* line 1292 "" *)
  2012.      WITH t^.Class DO
  2013. (* line 1292 "" *)
  2014.       
  2015.     MakeRelation (DP, InstCount, InstCount);
  2016.     relation := DP;
  2017.     MakeSet (Results  , InstCount);
  2018.     MakeSet (Arguments, InstCount);
  2019.     Class := t;
  2020.     Attribute := IdentifyAttribute (t, iNull);
  2021.     DummyIndex := Attribute^.Attribute.AttrIndex;
  2022.     INCL (Instance^[DummyIndex].Properties, Left);
  2023.     CompDP1 (t, Results, Write, TRUE, TRUE);
  2024.     ReleaseSet (Results  );
  2025.     ReleaseSet (Arguments);
  2026. ;
  2027.       RETURN;
  2028.      END;
  2029.  
  2030.   END;
  2031.  END CompDP;
  2032.  
  2033. PROCEDURE CopyProperties (t: Tree.tTree);
  2034.  VAR yyTempo: RECORD CASE : INTEGER OF
  2035.  END; END;
  2036.  BEGIN
  2037.   IF t = Tree.NoTree THEN RETURN; END;
  2038.   IF (t^.Kind = Tree.Class) THEN
  2039. (* line 1309 "" *)
  2040.      WITH t^.Class DO
  2041. (* line 1309 "" *)
  2042.       
  2043.     FOR i := 1 TO InstCount DO
  2044.        WITH Instance^[i] DO
  2045.           Properties := Properties + Attribute^.Child.Properties;
  2046.           IF (Action # ADR (Action)) AND (Action^.Kind = Tree.Copy) THEN
  2047.          INCL (Properties, CopyDef);
  2048.          INCL (Instance^[CopyArg].Properties, CopyUse);
  2049.           END;
  2050.       IF IsElement (ORD ('2'), Options) THEN
  2051.           IF NOT (NonBaseComp IN Properties) AND (Action # ADR (Action)) AND
  2052.          (({Synthesized, Left} <= Properties) OR
  2053.          ({Inherited, Right} <= Properties)) THEN
  2054.          WriteIdent    (StdOutput, Name);
  2055.          WriteS         (StdOutput, "    = { ");
  2056.          WriteClass    (Action);
  2057.          WriteS         (StdOutput, " } .");
  2058.          WriteNl    (StdOutput);
  2059.           END;
  2060.       END;
  2061.        END;
  2062.     END;
  2063. ;
  2064.       RETURN;
  2065.      END;
  2066.  
  2067.   END;
  2068.  END CopyProperties;
  2069.  
  2070. PROCEDURE CheckUsage (t: Tree.tTree);
  2071.  VAR yyTempo: RECORD CASE : INTEGER OF
  2072.  END; END;
  2073.  BEGIN
  2074.   IF t = Tree.NoTree THEN RETURN; END;
  2075.   IF (t^.Kind = Tree.Class) THEN
  2076. (* line 1335 "" *)
  2077.      WITH t^.Class DO
  2078. (* line 1335 "" *)
  2079.       
  2080.     IF Extensions^.Kind = Tree.NoClass THEN        (* Low ? *)
  2081.        Class := t;
  2082.        IsAbstract := Abstract IN Properties;
  2083.        ForallAttributes (t, CheckUsage);
  2084.     END;
  2085. ;
  2086.       RETURN;
  2087.      END;
  2088.  
  2089.   END;
  2090.   IF (t^.Kind = Tree.Child) THEN
  2091. (* line 1342 "" *)
  2092.      WITH t^.Child DO
  2093. (* line 1342 "" *)
  2094.       
  2095.       IF NOT IsElement (ORD ('W'), Options) AND NOT IsAbstract THEN
  2096.     IF NOT (Input IN Properties) AND NOT (Write IN Properties) THEN
  2097. Tree.WarningI (AttributeNeverSet, t^.Child.Pos, Errors.Ident, ADR (Name));
  2098.     END;
  2099.     IF NOT (Output IN Properties) AND NOT (Read IN Properties) AND
  2100.        NOT IsElement (ORD ('x'), Options) AND
  2101.        NOT IsElement (ORD ('z'), Options) AND
  2102.        NOT IsElement (ORD ('u'), Options) THEN
  2103. Tree.WarningI (AttributeNeverUsed, t^.Child.Pos, Errors.Ident, ADR (Name));
  2104.     END;
  2105.       END;
  2106.     IF ({Input, Write} <= Properties) AND ((Class = NoTree) OR
  2107.        (Class # NoTree) AND NOT (Terminal IN Class^.Class.Properties)) THEN
  2108. Tree.ErrorI (InputAttributeIsSet, t^.Child.Pos, Errors.Ident, ADR (Name));
  2109.     END;
  2110.     IF {Synthesized, Inherited} <= Properties THEN
  2111. Tree.ErrorI (AttributeSynthesizedAsWellAsInherited, t^.Child.Pos, Errors.Ident, ADR (Name));
  2112.     END;
  2113. ;
  2114.       RETURN;
  2115.      END;
  2116.  
  2117.   END;
  2118.   IF (t^.Kind = Tree.Attribute) THEN
  2119. (* line 1362 "" *)
  2120.    LOOP
  2121.      WITH t^.Attribute DO
  2122. (* line 1363 "" *)
  2123.       IF NOT (({Test, Dummy} * Properties) = {}) THEN EXIT; END;
  2124. (* line 1364 "" *)
  2125.            IF NOT IsElement (ORD ('W'), Options) AND NOT IsAbstract THEN
  2126.     IF NOT (Input IN Properties) AND NOT (Write IN Properties) THEN
  2127. Tree.WarningI (AttributeNeverSet, t^.Attribute.Pos, Errors.Ident, ADR (Name));
  2128.     END;
  2129.     IF NOT (Output IN Properties) AND NOT (Read IN Properties) THEN
  2130. Tree.WarningI (AttributeNeverUsed, t^.Attribute.Pos, Errors.Ident, ADR (Name));
  2131.     END;
  2132.       END;
  2133.     IF ({Input, Write} <= Properties) AND ((Class = NoTree) OR
  2134.        (Class # NoTree) AND NOT (Terminal IN Class^.Class.Properties)) THEN
  2135. Tree.ErrorI (InputAttributeIsSet, t^.Attribute.Pos, Errors.Ident, ADR (Name));
  2136.     END;
  2137.     IF {Synthesized, Inherited} <= Properties THEN
  2138. Tree.ErrorI (AttributeSynthesizedAsWellAsInherited, t^.Attribute.Pos, Errors.Ident, ADR (Name));
  2139.     END;
  2140. ;
  2141.       RETURN;
  2142.      END;
  2143.    END;
  2144.  
  2145.   END;
  2146.  END CheckUsage;
  2147.  
  2148. PROCEDURE CheckUsage2 (t: Tree.tTree);
  2149.  VAR yyTempo: RECORD CASE : INTEGER OF
  2150.  | 1: yyR1: RECORD
  2151.   String: tString;
  2152.   END;
  2153.  END; END;
  2154.  BEGIN
  2155.   IF t = Tree.NoTree THEN RETURN; END;
  2156.   IF (t^.Kind = Tree.Class) THEN
  2157. (* line 1384 "" *)
  2158.     WITH yyTempo.yyR1 DO
  2159.    LOOP
  2160.      WITH t^.Class DO
  2161. (* line 1385 "" *)
  2162.       IF NOT (NOT IsElement (ORD ('W'), Options)) THEN EXIT; END;
  2163. (* line 1386 "" *)
  2164.       IF NOT (NOT (Reachable IN Properties)) THEN EXIT; END;
  2165. (* line 1387 "" *)
  2166.       ;
  2167. (* line 1388 "" *)
  2168.       GetString (Name, String);
  2169. (* line 1389 "" *)
  2170.       IF NOT ((Char (String, 1) # 'y') AND (Char (String, 2) # 'y')) THEN EXIT; END;
  2171. (* line 1390 "" *)
  2172.       Tree . WarningI (NodeTypeNotUsed, t ^ . Class . Pos, Errors . Ident, ADR (Name));
  2173.       RETURN;
  2174.      END;
  2175.    END;
  2176.     END;
  2177.  
  2178.   END;
  2179.  END CheckUsage2;
  2180.  
  2181. PROCEDURE CheckInherited (t: Tree.tTree);
  2182.  VAR yyTempo: RECORD CASE : INTEGER OF
  2183.  END; END;
  2184.  BEGIN
  2185.   IF t = Tree.NoTree THEN RETURN; END;
  2186.   IF (t^.Kind = Tree.Class) THEN
  2187. (* line 1396 "" *)
  2188.      WITH t^.Class DO
  2189. (* line 1396 "" *)
  2190.       
  2191.     IF BaseClass^.Kind = Tree.Class THEN        (* NOT Top ? *)
  2192.        CheckInherited (Attributes);
  2193.     END;
  2194. ;
  2195.       RETURN;
  2196.      END;
  2197.  
  2198.   END;
  2199.   IF (t^.Kind = Tree.Child) THEN
  2200. (* line 1401 "" *)
  2201.      WITH t^.Child DO
  2202. (* line 1401 "" *)
  2203.       
  2204.     IF Inherited IN Properties THEN
  2205. Tree.ErrorI (InheritedAttributesOnlyInBaseClasses, t^.Child.Pos, Errors.Ident, ADR (Name));
  2206.     END;
  2207.     CheckInherited (Next);
  2208. ;
  2209.       RETURN;
  2210.      END;
  2211.  
  2212.   END;
  2213.   IF (t^.Kind = Tree.Attribute) THEN
  2214. (* line 1407 "" *)
  2215.      WITH t^.Attribute DO
  2216. (* line 1407 "" *)
  2217.       
  2218.     IF Inherited IN Properties THEN
  2219. Tree.ErrorI (InheritedAttributesOnlyInBaseClasses, t^.Attribute.Pos, Errors.Ident, ADR (Name));
  2220.     END;
  2221.     CheckInherited (Next);
  2222. ;
  2223.       RETURN;
  2224.      END;
  2225.  
  2226.   END;
  2227.  END CheckInherited;
  2228.  
  2229. PROCEDURE CheckComplete (t: Tree.tTree);
  2230.  VAR yyTempo: RECORD CASE : INTEGER OF
  2231.  END; END;
  2232.  BEGIN
  2233.   IF t = Tree.NoTree THEN RETURN; END;
  2234.   IF (t^.Kind = Tree.Class) THEN
  2235. (* line 1417 "" *)
  2236.      WITH t^.Class DO
  2237. (* line 1417 "" *)
  2238.       
  2239.     IF (Extensions^.Kind = Tree.NoClass) OR        (* Low ? *)
  2240.            NOT IsElement (ORD ('B'), Options) THEN
  2241.        FOR i := 1 TO InstCount DO
  2242.           WITH Instance^ [i] DO
  2243.          IF NOT (Computed IN Properties) AND
  2244.             ((Terminal IN t^.Class.Properties) AND (Attribute^.Kind = Tree.Attribute) OR
  2245.             ({Synthesized, Left} <= Properties) OR
  2246.             ({Inherited,  Right} <= Properties)) THEN
  2247.             CopyRule (t);
  2248.             IF j = 0 THEN
  2249.                GetString (Name, String);
  2250.                ArrayToString (" = ", String2);
  2251.                Concatenate (String, String2);
  2252.                IF Right IN Properties THEN
  2253.               GetString (Selector^.Child.Name, String2);
  2254.               Concatenate (String, String2);
  2255.               Append    (String, ':');
  2256.               GetString (Attribute^.Child.Name, String2);
  2257.               Concatenate (String, String2);
  2258.                ELSE
  2259.               GetString (Attribute^.Child.Name, String2);
  2260.               Concatenate (String, String2);
  2261.                END;
  2262. Tree.ErrorI (AttributeComputationMissing, t^.Class.Pos, Errors.String, ADR (String));
  2263.             END;
  2264.          END;
  2265.           END;
  2266.        END;
  2267.     END;
  2268.  
  2269.       IF IsElement (ORD ('L'), Options) THEN
  2270.     FOR i := 1 TO AttrCount DO
  2271.        WITH Instance^ [i] DO
  2272.           IF NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) THEN
  2273.          FOR j := 1 TO InstCount DO
  2274.             IF IsRelated (j, i, DP) THEN
  2275.                FOR k := 1 TO AttrCount DO
  2276.               IF IsRelated (k, j, DP) THEN
  2277.                  Relations.Include (DP, k, i);
  2278.               END;
  2279.                END;
  2280.             END;
  2281.          END;
  2282.           END;
  2283.        END;
  2284.     END;
  2285.       END;
  2286.  
  2287.     IF IsCyclic (DP) THEN
  2288. Tree.ErrorI (CycleInLocalDependenciesDP, t^.Class.Pos, Errors.Ident, ADR (Name));
  2289.        WriteS (StdOutput, "Attribute Dependencies DP");
  2290.        WriteNl (StdOutput); WriteNl (StdOutput);
  2291.        WriteDependencies (t, DP, MaxSet);
  2292.        WriteS (StdOutput, "Cyclic Attributes");
  2293.        WriteNl (StdOutput); WriteNl (StdOutput);
  2294.        MakeSet (Cyclics, InstCount);
  2295.        GetCyclics (DP, Cyclics);
  2296.        WriteCyclics (t, Cyclics); WriteNl (StdOutput);
  2297.        ReleaseSet (Cyclics);
  2298.        Success := FALSE;
  2299.     END;
  2300.       IF IsElement (ORD ('M'), Options) THEN
  2301.     WriteClass (t); WriteNl (StdOutput);
  2302.       END;
  2303.       IF IsElement (ORD ('P'), Options) THEN
  2304.     WriteDependencies (t, DP, MaxSet);
  2305.       END;
  2306. ;
  2307.       RETURN;
  2308.      END;
  2309.  
  2310.   END;
  2311.  END CheckComplete;
  2312.  
  2313. PROCEDURE CopyRule (t: Tree.tTree);
  2314.  VAR yyTempo: RECORD CASE : INTEGER OF
  2315.  END; END;
  2316.  BEGIN
  2317.   IF t = Tree.NoTree THEN RETURN; END;
  2318.   IF (t^.Kind = Tree.Class) THEN
  2319. (* line 1490 "" *)
  2320.      WITH t^.Class DO
  2321. (* line 1490 "" *)
  2322.       
  2323.     WITH Instance^ [i] DO
  2324.        j := 0;
  2325.        IF i <= AttrCount THEN
  2326.           Ident := Attribute^.Attribute.Name;
  2327.           ForallAttributes (t, CopyRule2);
  2328.           IF j # 0 THEN
  2329.          INC (j, AttrCount + Child^.Child.InstOffset);
  2330.          Action := mCopy (nNoAction, NoPosition,
  2331.             mIdent (Ident, NoPosition, nNoDesignator),
  2332.             mDesignator (Instance ^[j].Selector^.Child.Name, Ident, NoPosition, nNoDesignator));
  2333.          INC (CopySynthesized);
  2334.           END;
  2335.           IF (j = 0) AND (Thread IN Properties) THEN
  2336.          j := i - 1;
  2337.          Action := mCopy (nNoAction, NoPosition,
  2338.             mIdent (Ident, NoPosition, nNoDesignator),
  2339.             mIdent (Instance^ [j].Attribute^.Attribute.Name, NoPosition, nNoDesignator));
  2340.          INC (CopyThreaded);
  2341.           END;
  2342.        ELSE
  2343.           IF (Thread IN Properties) AND (Selector^.Child.InstOffset > 0) THEN
  2344.          Ident := Instance^ [i+1].Attribute^.Attribute.Name;    (* Out companion *)
  2345.          j := i - 1;
  2346.          LOOP
  2347.             IF j <= AttrCount THEN j := 0; EXIT; END;
  2348.             IF Instance^ [j].Attribute^.Attribute.Name = Ident THEN
  2349.                Action := mCopy (nNoAction, NoPosition,
  2350.               mDesignator (Selector^.Child.Name, Attribute^.Attribute.Name, NoPosition, nNoDesignator),
  2351.               mDesignator (Instance^ [j].Selector^.Child.Name, Ident, NoPosition, nNoDesignator));
  2352.                INC (CopyThreaded);
  2353.                EXIT;
  2354.             END;
  2355.             DEC (j);
  2356.          END;
  2357.           END;
  2358.           IF j = 0 THEN
  2359.          Ident := Attribute^.Attribute.Name;
  2360.          ForallAttributes (t, CopyRule);
  2361.          IF j # 0 THEN
  2362.             Action := mCopy (nNoAction, NoPosition,
  2363.                mDesignator (Selector^.Child.Name, Ident, NoPosition, nNoDesignator),
  2364.                mIdent (Ident, NoPosition, nNoDesignator));
  2365.             INC (CopyInherited);
  2366.          END;
  2367.           END;
  2368.        END;
  2369.        IF j # 0 THEN
  2370.       IF IsElement (ORD ('1'), Options) THEN
  2371.           WriteIdent (StdOutput, Name);
  2372.           WriteS     (StdOutput, "    = { ");
  2373.           WriteClass (Action);
  2374.           WriteS     (StdOutput, " } .");
  2375.           WriteNl     (StdOutput);
  2376.       END;
  2377.           CopyArg := j;
  2378.           TheAction := Action;
  2379.           Relations.Include (DP, i, j);
  2380.           INCL (Properties, CopyDef);
  2381.           INCL (Instance^[CopyArg].Properties, CopyUse);
  2382.           INCL (Properties, Write);
  2383.           INCL (Properties, Computed);
  2384.           INCL (Instance^[CopyArg].Properties, Read);
  2385.           INCL (Attribute^.Attribute.Properties, Write);
  2386.           INCL (Attribute^.Attribute.Properties, Computed);
  2387.           INCL (Instance^[CopyArg].Attribute^.Attribute.Properties, Read);
  2388.           IF Right IN Properties THEN
  2389.          INCL (Selector^.Child.Properties, Read);
  2390.           END;
  2391.           IF Right IN Instance^[CopyArg].Properties THEN
  2392.          INCL (Instance^[CopyArg].Selector^.Child.Properties, Read);
  2393.           END;
  2394.        END;
  2395.     END;
  2396.     IF j # 0 THEN                (* update abstract syntax *)
  2397.        INCL (Properties, HasActions);
  2398.        IF Attributes^.Kind = Tree.NoAttribute THEN
  2399.           Attributes := mActionPart (Attributes, TheAction);
  2400.        ELSE
  2401.           Node := Attributes;
  2402.           WHILE Node^.AttrOrAction.Next^.Kind # Tree.NoAttribute DO
  2403.          Node := Node^.AttrOrAction.Next;
  2404.           END;
  2405.           IF Node^.Kind = Tree.ActionPart THEN
  2406.          TheAction^.Action.Next := Node^.ActionPart.Actions;
  2407.          Node^.ActionPart.Actions := TheAction;
  2408.           ELSE
  2409.          Node^.AttrOrAction.Next := mActionPart (nNoAttribute, TheAction);
  2410.           END;
  2411.        END;
  2412.     END;
  2413. ;
  2414.       RETURN;
  2415.      END;
  2416.  
  2417.   END;
  2418.   IF (t^.Kind = Tree.Child) THEN
  2419. (* line 1582 "" *)
  2420.      WITH t^.Child DO
  2421. (* line 1582 "" *)
  2422.       
  2423.     IF Name = Ident THEN Child := Attribute; j := AttrIndex; END;
  2424. ;
  2425.       RETURN;
  2426.      END;
  2427.  
  2428.   END;
  2429.   IF (t^.Kind = Tree.Attribute) THEN
  2430. (* line 1585 "" *)
  2431.      WITH t^.Attribute DO
  2432. (* line 1585 "" *)
  2433.       
  2434.     IF Name = Ident THEN Child := Attribute; j := AttrIndex; END;
  2435. ;
  2436.       RETURN;
  2437.      END;
  2438.  
  2439.   END;
  2440.  END CopyRule;
  2441.  
  2442. PROCEDURE CopyRule2 (t: Tree.tTree);
  2443.  VAR yyTempo: RECORD CASE : INTEGER OF
  2444.  END; END;
  2445.  BEGIN
  2446.   IF t = Tree.NoTree THEN RETURN; END;
  2447.   IF (t^.Kind = Tree.Child) THEN
  2448. (* line 1592 "" *)
  2449.    LOOP
  2450.      WITH t^.Child DO
  2451. (* line 1593 "" *)
  2452.       IF NOT (Class # NoTree) THEN EXIT; END;
  2453. (* line 1594 "" *)
  2454.       Attribute := t;
  2455. (* line 1595 "" *)
  2456.       ForallAttributes (Class, CopyRule);
  2457.       RETURN;
  2458.      END;
  2459.    END;
  2460.  
  2461.   END;
  2462.  END CopyRule2;
  2463.  
  2464. PROCEDURE IsCopy (yyP1: Tree.tTree): BOOLEAN;
  2465.  VAR yyTempo: RECORD CASE : INTEGER OF
  2466.  | 1: yyR1: RECORD
  2467.   Attr: tTree;
  2468.   ChildsClass: tTree;
  2469.   END;
  2470.  END; END;
  2471.  BEGIN
  2472.   IF yyP1 = Tree.NoTree THEN RETURN FALSE; END;
  2473.   IF (yyP1^.Kind = Tree.Designator) THEN
  2474. (* line 1600 "" *)
  2475.     WITH yyTempo.yyR1 DO
  2476.    LOOP
  2477.      WITH yyP1^.Designator DO
  2478. (* line 1601 "" *)
  2479.       ;
  2480. (* line 1602 "" *)
  2481.       Attr := IdentifyAttribute (Class, Selector);
  2482. (* line 1603 "" *)
  2483.       IF NOT (Attr # NoTree) THEN EXIT; END;
  2484. (* line 1604 "" *)
  2485.       IF NOT (Attr ^ . Kind = Tree . Child) THEN EXIT; END;
  2486. (* line 1605 "" *)
  2487.       ChildsClass := Attr ^ . Child . Class;
  2488. (* line 1606 "" *)
  2489.       IF NOT (ChildsClass # NoTree) THEN EXIT; END;
  2490. (* line 1607 "" *)
  2491.       IF NOT (IdentifyAttribute (ChildsClass, Attribute) # NoTree) THEN EXIT; END;
  2492. (* line 1608 "" *)
  2493.       IF NOT (IsWhiteSpace (Next)) THEN EXIT; END;
  2494.       RETURN TRUE;
  2495.      END;
  2496.    END;
  2497.     END;
  2498.  
  2499.   END;
  2500.   IF (yyP1^.Kind = Tree.Ident) THEN
  2501. (* line 1610 "" *)
  2502.    LOOP
  2503.      WITH yyP1^.Ident DO
  2504. (* line 1611 "" *)
  2505.       IF NOT (IdentifyAttribute (Class, Attribute) # NoTree) THEN EXIT; END;
  2506. (* line 1612 "" *)
  2507.       IF NOT (IsWhiteSpace (Next)) THEN EXIT; END;
  2508.       RETURN TRUE;
  2509.      END;
  2510.    END;
  2511.  
  2512.   END;
  2513.   IF (yyP1^.Kind = Tree.Any) THEN
  2514. (* line 1614 "" *)
  2515.    LOOP
  2516.      WITH yyP1^.Any DO
  2517. (* line 1615 "" *)
  2518.       IF NOT (IsWhiteSpace2 (Code)) THEN EXIT; END;
  2519. (* line 1616 "" *)
  2520.       IF NOT (IsCopy (Next)) THEN EXIT; END;
  2521.       RETURN TRUE;
  2522.      END;
  2523.    END;
  2524.  
  2525.   END;
  2526.   IF (yyP1^.Kind = Tree.Anys) THEN
  2527. (* line 1618 "" *)
  2528.    LOOP
  2529.      WITH yyP1^.Anys DO
  2530. (* line 1619 "" *)
  2531.       IF NOT (IsCopy (Next)) THEN EXIT; END;
  2532.       RETURN TRUE;
  2533.      END;
  2534.    END;
  2535.  
  2536.   END;
  2537.   RETURN FALSE;
  2538.  END IsCopy;
  2539.  
  2540. PROCEDURE IsWhiteSpace (yyP2: Tree.tTree): BOOLEAN;
  2541.  VAR yyTempo: RECORD CASE : INTEGER OF
  2542.  END; END;
  2543.  BEGIN
  2544.   IF yyP2 = Tree.NoTree THEN RETURN FALSE; END;
  2545.   IF (yyP2^.Kind = Tree.Any) THEN
  2546. (* line 1624 "" *)
  2547.    LOOP
  2548.      WITH yyP2^.Any DO
  2549. (* line 1625 "" *)
  2550.       IF NOT (IsWhiteSpace2 (Code)) THEN EXIT; END;
  2551. (* line 1626 "" *)
  2552.       IF NOT (IsWhiteSpace (Next)) THEN EXIT; END;
  2553.       RETURN TRUE;
  2554.      END;
  2555.    END;
  2556.  
  2557.   END;
  2558.   IF (yyP2^.Kind = Tree.Anys) THEN
  2559. (* line 1628 "" *)
  2560.    LOOP
  2561.      WITH yyP2^.Anys DO
  2562. (* line 1629 "" *)
  2563.       IF NOT (IsWhiteSpace (Next)) THEN EXIT; END;
  2564.       RETURN TRUE;
  2565.      END;
  2566.    END;
  2567.  
  2568.   END;
  2569.   IF (yyP2^.Kind = Tree.NoDesignator) THEN
  2570. (* line 1631 "" *)
  2571.       RETURN TRUE;
  2572.  
  2573.   END;
  2574.   RETURN FALSE;
  2575.  END IsWhiteSpace;
  2576.  
  2577. PROCEDURE IsWhiteSpace2 (yyP3: tStringRef): BOOLEAN;
  2578. (* line 1634 "" *)
  2579.  VAR i: CARDINAL; 
  2580.  VAR yyTempo: RECORD CASE : INTEGER OF
  2581.  | 1: yyR1: RECORD
  2582.   String: tString;
  2583.   ch: CHAR;
  2584.   END;
  2585.  END; END;
  2586.  BEGIN
  2587. (* line 1636 "" *)
  2588.     WITH yyTempo.yyR1 DO
  2589. (* line 1637 "" *)
  2590.       ;
  2591. (* line 1638 "" *)
  2592.       StringMem . GetString (yyP3, String);
  2593. (* line 1639 "" *)
  2594.         FOR i := 1 TO Length (String) DO
  2595.       ch := Char (String, i);
  2596.       IF (ch # ' ') AND (ch # 012C) AND (ch # 011C) THEN RETURN FALSE; END;
  2597.    END;
  2598. ;
  2599.       RETURN TRUE;
  2600.     END;
  2601.  
  2602.  END IsWhiteSpace2;
  2603.  
  2604. PROCEDURE BeginSemantics;
  2605.  BEGIN
  2606. (* line 605 "" *)
  2607.  
  2608.    ItemCount        := 0;
  2609.    ChecksCount        := 0;
  2610.    MaxInstCount        := 0;
  2611.    CopyInherited    := 0;
  2612.    CopySynthesized    := 0;
  2613.    CopyThreaded        := 0;
  2614.    IntToString (0, String); iNull := MakeIdent (String);
  2615.  
  2616.  END BeginSemantics;
  2617.  
  2618. PROCEDURE CloseSemantics;
  2619.  BEGIN
  2620.  END CloseSemantics;
  2621.  
  2622. PROCEDURE yyExit;
  2623.  BEGIN
  2624.   IO.CloseIO; System.Exit (1);
  2625.  END yyExit;
  2626.  
  2627. BEGIN
  2628.  yyf    := IO.StdOutput;
  2629.  Exit    := yyExit;
  2630.  BeginSemantics;
  2631. END Semantics.
  2632.